Rust 迭代器iter以及into_iter差別
最近很常用到兩個迭代器iter和into_iter
但不是很理解兩個有什麼差別
特地查一下順便寫成一篇文章
先看看iter的方法
pub fn iter(&self) -> Iter<'_, T> {
而這是into_iter的
fn into_iter(self) -> Self::IntoIter {
iter表示引用,即使迭代之後還是可以繼續使用此參數
into_iter表示直接取得所有權,其他的變數不能再次使用此參數
例如
let numbers = vec![10, 25, 5, 32, 8, 15];
let vec1 = numbers.iter().map(|x: &i32| x + 1).collect::<Vec<_>>();
let vec2 = numbers.into_iter().map(|x: i32| x + 1).collect::<Vec<_>>();
第一行創建一個數組
第二行透過iter引用number數組,因為是使用iter因此第三行還是可以再次使用
可看出第二行的x是&32,而into_iter的x則是i32
但如果講第二行與第三行相反,則會發生panic
let numbers = vec![10, 25, 5, 32, 8, 15];
let vec2 = numbers.into_iter().map(|x: i32| x + 1).collect::<Vec<_>>();
let vec1 = numbers.iter().map(|x: &i32| x + 1).collect::<Vec<_>>();
error[E0382]: borrow of moved value: `numbers`
--> src\main.rs:4:16
|
2 | let numbers = vec![10, 25, 5, 32, 8, 15];
| ------- move occurs because `numbers` has type `Vec<i32>`, which does not implement the `Copy` trait
3 | let vec2 = numbers.into_iter().map(|x: i32| x + 1).collect::<Vec<_>>();
| ----------- `numbers` moved due to this method call
//這裡已經被移動
4 | let vec1 = numbers.iter().map(|x: &i32| x + 1).collect::<Vec<_>>();
| ^^^^^^^^^^^^^^ value borrowed here after move
| //移動後不能再次引用
note: `into_iter` takes ownership of the receiver `self`, which moves `numbers`
可以看出
在第二行的時候,已經將所有權透過into_iter
因此第三行要再使用數組時,會發生panic
panic明確表明因為numbers已經被移動,卻還是想要在移動後借用
因此panic
0 comments:
張貼留言