隱私權政策

搜尋此網誌

技術提供:Blogger.

關於我自己

我的相片
目前從事軟體相關行業,喜歡閱讀、健身、喝調酒。習慣把遇到的問題記下來,每天做一些整理方便自己以後查。 Python、Rust、Kotlin等程式語言皆為自學,目前比較著重在Rust語言,歡迎一起討論。

2023年11月4日 星期六

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:

張貼留言