为什么我可以用for构造循环一个不可变的迭代器?

时间:2018-04-29 16:37:30

标签: iterator rust

出于学习目的,我试图通过迭代器的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()手动触发突变,这次,从外面看可见吗?

0 个答案:

没有答案