rust-quiz:004-dotdot-in-tuple.rs

题目

fn main() {
    let (.., x, y) = (0, 1, ..);
    print!("{}", b"066"[y][x]);
}

关键

  • 脱糖
    rust中有很多糖,有些甚至我们也无法判断它是不是糖。
    但是我们需要知道一些自动化的对称,比如一些糖的外观和实际的替换。
    正如实现了Add的结构可以通过+进行运算,实现BitAnd可以&
    还有match中的_其实是WildCard匹配。
    还有本题中的..也可以是RangFull

  • 匹配
    match需要关注两个点:数据和模式。
    左边的是匹配的模式,可以提取数据。
    右边的是数据,根据不同的模式可以取出对应的值。
    不过最为特殊的情况是,有些数据本身就可以作为匹配的模式,比如..

  • string
    rust中的字符串的确令人眼花缭乱,让人深感头大。
    不过也无需考虑string的编解码了,因为rust中的string固定就是utf-8编码。
    都知道string的底层是[u8;N],为了方便操作string,还有一些特殊的string
    这里都详细描述了。
    其中比较不同的是b"string",看起来是直白的字符串,但实际上只是单纯的[u8;N]
    这是简单的直接的ASCII的字符串声明。

  • ..
    上面也说了RangeFull,这里说一下slice
    就是对底层数组的区间范围索引取值,这就是为什么总是把slice叫做view

  • [?]:单个索引的情况,就是直接取出对应索引的值。

  • [..]:范围索引,取出对应部分的值,也是我们创建切片的手段。

题解

  • 匹配
    let (.., x, y) = (0, 1, ..);
    第一个..在模式项中,表达的是任意匹配,因此,其中xy对应的取值就是元组数据中的最后两个。
  • x: 1
  • y:..

第二个..也就是y的值,就是RangeFull,看起来让人摸不着头脑。
不过它就是一个具体的对象,能当做匹配项的一个对象。

  • 字符
    b"066",这里其实其实是一个ASCII编码字符,是一个[u8;N]
    查表以后不难得出具体的数值[48, 54, 54]

  • 切片
    至此,我们解读一下b"066"[y],经过上述的解释,它可以转化为[48,54,54][..]
    结果不言而喻,我们的到了一个切片[48,54,54]

  • 取值
    整体计算一下b"066"[y][x],得到[48,54,54][..][1]
    切片之后取值,得到的是54

因此,整体答案就是打印54

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!