出于学习目的,我试图通过迭代器的match
方法next()
。
如果我将迭代器声明为不可变的,就像在下面的代码片段中一样,编译器会对我说我必须使用let mut x_iter
代替:
let x = vec![1, 2, 3];
let x_iter = x.iter();
loop {
match x_iter.next() {
Some(v) => { println!("{}", v); }
None => { println!("end"); break; }
}
}
这会触发以下错误:
error: cannot borrow immutable local variable `x_iter` as mutable
--> src/main.rs:6:15
|
3 | let x_iter = x.iter();
| ------ use `mut x_iter` here to make mutable
...
6 | match x_iter.next() {
| ^^^^^^ cannot borrow mutably
如果我改用let mut x_iter = ...
,那么一切正常。
为什么我首先要将x_iter
声明为可变,因为我没有在match
块中对其进行变更?
有人会争辩说,next()
方法 确实在改变迭代器,因为它需要将指针递增到下一个元素。这将成为使用可变迭代器的一个令人信服的论据。
但是,使用for v in x_iter { }
时情况不是这样吗?这个结构肯定适用于不可变的迭代器。是因为for
构造修改指针内部然后保持对象不变为外部世界,而使用next()
手动触发突变,这次,从外面看可见吗?