嵌套迭代器的循环

时间:2016-08-05 00:57:19

标签: rust

如您所知,如果直接将迭代器传递给迭代器,则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)?

1 个答案:

答案 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;
        }
    }
}

Playground

while let Some(v) = i.next()或多或少直接等同于" for循环而不借用迭代器"。反过来,它基本上只是:

loop {
    match i.next() {
        Some(v) => { loop_body },
        _ => { break; },
    };
}

额外奖励:您可以在几乎任何其他要重复调用的表达式上使用while let来返回和类型。

相关问题