隱私權政策

搜尋此網誌

技術提供:Blogger.

關於我自己

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

2023年10月27日 星期五

Rust 迭代map概述 - 操作數組中每個元素


最近打程式打到現在

真的覺得map太好用了

這一篇會先稍微講述map的用法

如果有時間會在講進階用法


Map

Map被歸類在iter下

先看看文件[1]

    fn map<B, F>(self, f: F) -> Map<Self, F>
    where
        Self: Sized,
        F: FnMut(Self::Item) -> B,

建立一個迭代器,該迭代器在每個元素呼叫閉包

簡單來說就是可以對數組中每個值做處理


實際舉一個例子

有一個數組,希望對每個數值加一

常見會這樣做

let mut num: Vec<_> = vec![1, 2, 3, 4, 5, 6];
    for i in num {
        num[i] += 1;
    }

但透過map可以將程式碼簡化

    let mut num: Vec<_> = vec![1, 2, 3, 4, 5, 6];
    let mut res: Vec<_> = num.iter().map(|x| x + 1).collect();
    assert_eq!(vec![2, 3, 4, 5, 6, 7], res);

第一行創建數組

第二行先將num傳入iter迭代器中

透過map將數組裡面的值+1後

透過collect重組回一個數組中

第三行則做確認

這邊有一個稍微一點點難度的題目

假設有一個數組

let words = vec!["apple", "banana", "cherry", "date"];

裡頭放的是&str

要求將所有的&str反轉

也就是呈現

["elppa", "ananab", "yrrehc", "etad"]

下方會有解答



這題通常會使用rev

rev可以將數值反向

因此這題可以這樣解

    let reversed: Vec<String> = words
        .iter()
        .map(|word| word.chars().rev().collect())
        .collect();

先使用iter將words放入迭代器

透過map對裡面的數值做處理

chars為將&str轉成字元char,並將字符反轉後透過collect蒐集成String

最後蒐集放進Vec


迭代器除了map,還有filter[2]、chain[3]、fold[4]

而map的應用也遠不止這篇文章所講的

之後在繼續把其他的心得寫上


參考資料

0 comments:

張貼留言