rust书中有一段使用了
let v = vec![1, 2, 3, 4, 5];
let third: &i32 = &v[2];
match v.get(2) {
Some(third) => println!("The third element is {}", third),
None => println!("There is no third element."),
在什么情况下才能触发None的情况呢?我只要引用了v中之外的对象就会panic,那是不是None那句话永远执行?
1
共 5 条评论, 1 页
评论区
写评论重新认识,第二次出现的
third
会覆盖第一个 third,被当新定义的变量使用。对以下内容的回复:
我感觉在这个例子里面,由于 third 已经绑定了,那么只要 get() 方法的参数,不是2, 是不是会挂啊? 即不能匹配 Some(third),也不能匹配 None 啊?
???
原来如此,谢谢解答~ 对以下内容的回复:
get这个函数是如果在范围外就是None, 中括号那个不用match的是如果在范围外就panic。 这是两个不同的做法。
你用中括号的时候是觉得你非常自信,你肯定不会访问到外面,打个比方,你上一句话刚push一个元素进去,然后你访问下标0,肯定不会越界,如果越界的话算bug,所以你出了bug就在panic里面看是哪一行代码导致panic,然后修复。但是如果你不确定,你就用get,也就是说越界是你可以预料到的可能的情况。
所以这两个函数在设计上是不同的。
同小白,我觉应该是vec的实际长度小于你获取的索引就会报None,比如在获取2之前调用三次remove(1)