< 返回版块

寝鬼社畜 发表于 2019-10-29 16:24

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那句话永远执行?

评论区

写评论
xie-jirong 2019-11-06 23:31

重新认识,第二次出现的 third 会覆盖第一个 third,被当新定义的变量使用。

对以下内容的回复:

xie-jirong 2019-11-04 22:28

我感觉在这个例子里面,由于 third 已经绑定了,那么只要 get() 方法的参数,不是2, 是不是会挂啊? 即不能匹配 Some(third),也不能匹配 None 啊?

???

作者 寝鬼社畜 2019-10-29 22:57

原来如此,谢谢解答~ 对以下内容的回复:

Krysme 2019-10-29 20:44

get这个函数是如果在范围外就是None, 中括号那个不用match的是如果在范围外就panic。 这是两个不同的做法。

你用中括号的时候是觉得你非常自信,你肯定不会访问到外面,打个比方,你上一句话刚push一个元素进去,然后你访问下标0,肯定不会越界,如果越界的话算bug,所以你出了bug就在panic里面看是哪一行代码导致panic,然后修复。但是如果你不确定,你就用get,也就是说越界是你可以预料到的可能的情况。

所以这两个函数在设计上是不同的。

jarontai 2019-10-29 17:57

同小白,我觉应该是vec的实际长度小于你获取的索引就会报None,比如在获取2之前调用三次remove(1)

1 共 5 条评论, 1 页