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需要关注两个点:数据和模式。
左边的是匹配的模式,可以提取数据。
右边的是数据,根据不同的模式可以取出对应的值。
不过最为特殊的情况是,有些数据本身就可以作为匹配的模式,比如..。stringrust中的字符串的确令人眼花缭乱,让人深感头大。
不过也无需考虑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:1y:..
第二个..也就是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 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: