如您所知,如果直接将迭代器传递给迭代器,则for in
循环在循环期间拥有其迭代器,如下所示:
let v = vec![...];
let mut i = v.iter();
for _ in i { }
正如malbarbo所述,您可以通过撰写for
指示i
引用i.by_ref()
。但是,你不能在for循环中重复这个:
for _ in i.by_ref() {
for _ in i.by_ref() {
// ^ error: cannot borrow `i` as mutable
// more than once at a time [--explain E0499]
break;
}
}
可以理解,外部for
循环必须修改它的迭代器,因此需要对它进行可变引用,而其他任何人都不能再在i
上调用可变方法。我们可以更直接地显示这个问题:
for _ in i.by_ref() {
i.next(); // same error
}
一个问题是使外for
成为loop
并直接致电i.next()
。有没有更漂亮的方法来获得我们的蛋糕(外部for循环遍历i
)并吃掉它(我们仍然可以在外部循环中前进i
)?
答案 0 :(得分:3)
使用while let
表达式可以做到这一点。
let x = vec![1, 2, 3, 5, 4, 6, 7, 5, 8, 5];
let mut i = x.iter();
while let Some(v) = i.next() {
println!("First before inner loop: {}", v);
for v in i.by_ref() {
if *v == 5 {
println!("Found a 5");
break;
}
}
}
while let Some(v) = i.next()
或多或少直接等同于" for循环而不借用迭代器"。反过来,它基本上只是:
loop {
match i.next() {
Some(v) => { loop_body },
_ => { break; },
};
}
额外奖励:您可以在几乎任何其他要重复调用的表达式上使用while let
来返回和类型。