为什么for循环不要求迭代器是可变的?

时间:2017-07-14 16:33:56

标签: rust immutability

我不明白Rust迭代器的可变性。为了弄清楚,我有以下几点:

struct Fibonacci {
    curr: u32,
    next: u32,
}

impl Iterator for Fibonacci {
    type Item = u32;

    fn next(&mut self) -> Option<u32> {
        let new_next = self.curr + self.next;
        self.curr = self.next;
        self.next = new_next;
        Some(self.curr)
    }
}

fn fibonacci() -> Fibonacci {
    Fibonacci { curr: 1, next: 1 }
}

fn main() {
    let f: Fibonacci = fibonacci();
    for i in f.take(5) {
        println!("> {}", i);
    }
}

很简单,我有一个自定义迭代器,我使用fibonacci返回。现在,当我创建它时,f变量是不可变的。 for循环中会发生什么影响? for循环是不是只是可变地使用f

1 个答案:

答案 0 :(得分:1)

  

for循环是否只是可变地使用f

没有。 take returns a new iterator。但即便如此,for is syntactic sugar。您的代码转换为

let f: Fibonacci = fibonacci();

{
    let result = match IntoIterator::into_iter(f.take(5)) {
        mut iter => {
            loop {
                match iter.next() {
                    Some(i) => {
                        println!("{}", i);
                    }
                    None => break,
                }
            }
        }
    };
    result
}

由于IntoIterator,我们永远不必改变ff.take(5),而只改变into_iter的结果。