2016-04-17 16 views
7

Можно ли утверждать, что вектор (среди других типов коллекций) является Iterator?В ржавчине, есть вектор Итератор?

Например, я могу перебирает вектор следующим образом, потому что он реализует Iterator черты (как я понимаю):

let v = vec![1, 2, 3, 4, 5]; 

for x in &v { 
    println!("{}", x); 
} 

Однако, если я хочу использовать функции, которые являются частью значение Iterator (например, fold, map или filter) почему я должен сначала позвонить iter() на этот вектор?

Еще одна мысль, которую я имел, может быть, что вектор можно преобразовать в Iterator, и в этом случае синтаксис выше имеет больше смысла.

+1

https://doc.rust-lang.org/book/iterators.html говорит о некоторых вещах о 'for x in & v' и' for x in v.iter() ', что также справедливо. Я не знаю Rust (пока), поэтому я не могу на самом деле объяснить или обобщить его, хотя! –

ответ

20

Нет, вектор не является итератором.

Но он реализует черту IntoIterator, которую цикл for использует для преобразования вектора в требуемый итератор.

В documentation for Vec вы можете увидеть, что IntoIterator осуществляется тремя способами: для Vec<T>, который перемещается и итератор возвращает элементы типа T, для общей ссылки &Vec<T>, где возвращает итератор совместно Ссылки на &T, и &mut Vec<T> , где возвращаются изменчивые ссылки.

iter() - это всего лишь метод в Vec для преобразования Vec<T> непосредственно в итератор, который возвращает общие ссылки, без предварительного преобразования его в ссылку. Существует метод sibling iter_mut() для создания изменяемых ссылок.

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