我有以下问题:
struct NiceStructure<'a, T: Iterator<Item=&'a u32>> {
it: T
}
fn f<'a, T: Iterator<Item=&'a u32>>(it: &mut NiceStructure<'a, T>) {
// This does not work (1): cannot move out of borrowed content
// for x in it.it {
// println!("Element {:?}", x);
// }
// This works
loop {
match it.it.next() {
None => break,
Some(x) => println!("Element {:?}", x)
}
}
}
fn g<'a, T: Iterator<Item=&'a u32>>(it: T) {
// This works (2)
for x in it {
println!("Element {:?}", x);
}
}
fn main() {
f(&mut NiceStructure{it: vec![1, 2, 3].iter()});
g(&mut vec![1, 2, 3].iter());
}
基于我对Rust的有限了解,for循环和嵌套next
显式调用的循环应该等效。
我正在为以下问题而苦苦挣扎:
(1)
不起作用,但是(2)
起作用?[编辑:我需要部分问题的更多帮助]
我无法从所重复的问题中找到所有问题的答案:更具体地说,我无法理解为什么我可以使用显式next
在该迭代器上进行迭代,但是我无法使用for
指令,与显式next
相比,在我看来只是语法糖。
[编辑其他渠道找到的答案]
尽管进行了编辑,问题仍然重复。 幸运的是,我找到了问题的答案。我在这里写它可能会有所帮助。
在传递it.it
作为可变引用时, NiceStructure
导致移动。
it.it.next()
使用it.it
的可变引用,因为next
方法采用&mut self
。
以下内容不起作用:
fn f<'a, T: Iterator<Item=&'a u32>>(it: &mut NiceStructure<'a, T>) {
// Here I am moving it.it, which is the same as when trying to use `for`
let my_iterator = it.it;
loop {
match my_iterator.next() {
None => break,
Some(x) => println!("Element {:?}", x)
}
}
}
以下内容确实如此:
fn f<'a, T: Iterator<Item=&'a u32>>(it: &mut NiceStructure<'a, T>) {
let my_iterator = &mut it.it;
loop {
match my_iterator.next() {
None => break,
Some(x) => println!("Element {:?}", x)
}
}
}
希望这会有所帮助。