2016-08-04 1 views
2

Как у вас есть for ... in loop заимствует итератор, над которым он работает? Например:Как можно занять итератор за цикл?

let x = vec![1, 2, 3, 4]; 
let i = x.iter(); 
for a1 in i { break; } // iterate over just one "i" 
for a2 in i { break; } // continue iterating through "i" here 

Вы не можете просто дать &i в ФОР, потому что тогда он не может преобразовать &Iterator к Iterator объекта.

ответ

2

вы можете использовать Iterator::by_ref заимствовать итератор и продолжать использовать его после заема заканчивается:

fn main() { 
    let x = vec![1, 2, 3, 4]; 
    let mut i = x.iter(); 
    for _ in i.by_ref() { break; } // iterate over just one "i" 
    for _ in i.by_ref() { break; } // continue iterating through "i" here 
    assert_eq!(Some(&3), i.next()) 
} 
+0

Это хороший ответ, b ut оно терпит неудачу если вы хотите иметь (даже non-mutable) вложенные итераторы на 'i'. – njaard

2

Все итераторы имеют next() функцию, которая перемещает итератор и возвращает Option<Self::Item> (то есть, они возвращают либо None или Some, содержащий значение любого типа вы итерация. Вы можете вызывать эту функцию самостоятельно, чтобы увеличить вручную . итератор однако во много раз вы хотите, что звучит, как это будет решить вашу проблему в этом случае

Смежные вопросы