Do iterators return a reference to items or the value of the items in Rust?

末鹿安然 提交于 2020-11-24 17:50:52

问题


If I have a vector:

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

And I iterate through it:

for &item in v.iter() {}

Would &item here be a reference or a value? It seems like it would be a reference from the & part, but reading the details seem to show it's a value???


回答1:


Do iterators return a reference to items or the value of the items in Rust?

There's no general answer to this question. An iterator can return either. You can find the type of the items by looking up the associated type Iterator::Item in the documentation. The documentation of Vec::iter(), for example, tells you that the return type is std::slice::Iter. The documentation of Iter in turn has a list of the traits the type implements, and the Iterator trait is one of them. If you expand the documentation, you can see

type Item = &'a T

which tells you that the item type for the iterator return by Vec<T>::iter() it &T, i.e. you get references to the item type of the vector itself.

In the notation

for &item in v.iter() {}

the part after for is a pattern that is matched against the items in the iterator. In the first iteration &item is matched against &0, so item becomes 0. You can read more about pattern matching in any Rust introduction.

Another way to iterate over the vector v is to write

for item in v {}

This will consume the vector, so it can't be used anymore after the loop. All items are moved out of the vector and returned by value. This uses the IntoIterator trait implemented for Vec<T>, so look it up in the documentation to find its item type!

The first loop above is usually written as

for &item in &v {}

which borrows v as a reference &Vec<i32>, and then calls IntoIterator on that reference, which will return the same Iter type mentioned above, so it will also yield references.



来源:https://stackoverflow.com/questions/60780389/do-iterators-return-a-reference-to-items-or-the-value-of-the-items-in-rust

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!