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, ..);
..
在模式项中,表达的是任意匹配,因此,其中x
和y
对应的取值就是元组数据中的最后两个。 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 协议》,转载必须注明作者和本文链接