我不明白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
?
答案 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
,我们永远不必改变f
或f.take(5)
,而只改变into_iter
的结果。