亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Rust語言之Iterator迭代器怎么使用

發布時間:2023-04-20 17:24:28 來源:億速云 閱讀:158 作者:iii 欄目:開發技術

這篇文章主要介紹了Rust語言之Iterator迭代器怎么使用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Rust語言之Iterator迭代器怎么使用文章都會有所收獲,下面我們一起來看看吧。

    在Rust語言中,迭代器(Iterator)是一種極為重要的數據類型,它們用于遍歷集合中的元素。Rust中的大多數集合類型都可轉換為一個迭代器,使它們可以進行遍歷,這包括數組、向量、哈希表等。

    使用迭代器可以讓代碼更加簡潔優雅,并且可以支持一些強大的操作,例如過濾、映射和折疊等。

    迭代器的基本概念

    迭代器是什么?

    在Rust中,迭代器是一個實現了Iterator trait的類型。該trait定義了一組行為,用于支持遍歷集合中的元素。通過實現Iterator trait,類型可以被轉換為一個迭代器,從而支持Iterate的操作。

    Iterator trait

    Iterator trait 定義了迭代器的核心行為,它包含了next方法和一些其他方法。next方法返回集合中下一個元素的Option值,直到集合中所有的元素都被遍歷完畢,返回None。

    除了next方法之外,Iterator trait 還定義了其他許多有用的方法,比如map、filter等,這些方法可以對迭代器中的元素進行操作和轉換。

    pub trait Iterator {
          type Item;
        fn next(&mut self) -> Option<Self::Item>;
        //  多種內置實現方法, skip, map, reduce, collect
        //  和Java中的Stream內置方法非常類似.
    }

    Animal示例

    接下來我們探討實現一個Animal迭代器,Animal實現Iterator trait,使其可以通過迭代器遍歷Animal的各個屬性。 以下是Animal類型的定義:

    #[derive(Debug)]
    struct Animal {
        name: String,
        age: u32,
        kind: String,
        i:i32,
    }

    我們可以在Animal上實現Iterator trait,使其可以通過for循環進行迭代。

    impl Iterator for Animal {
          type Item = String;
        fn next(&mut self) -> Option<Self::Item> {
              let next_attribute = match self.i {
                0 => Some(self.name.clone()),
                1 => Some(self.age.to_string()),
                2 => Some(self.kind.clone()),
                _ => None,
            };
            self.i += 1;
            next_attribute
        }
    }

    此時,我們已經將我們的類型轉換為迭代器,我們就可以在它上面調用各種Iterator trait 的方法。例如,我們可以使用for循環遍歷Animal對象的每一個屬性:

    #[derive(Debug)]
    struct Animal {
        name: String,
        age: u32,
        kind: String,
        i:i32,
    }
    impl Iterator for Animal {
          type Item = String;
        fn next(&mut self) -> Option<Self::Item> {
              let next_attribute = match self.i {
                0 => Some(self.name.clone()),
                1 => Some(self.age.to_string()),
                2 => Some(self.kind.clone()),
                _ => None,
            };
            self.i += 1;
            next_attribute
        }
    }
    fn main() {
        let mut animal = Animal {
            name: "Tom".to_string(),
            age : 15,
            kind: "cat".to_string(),
            i : 0
        };
        println!("Name: {}", animal.next().unwrap());
        println!("Age: {}", animal.next().unwrap());
        println!("Kind: {}", animal.next().unwrap());
    }
    //  輸出結果:
    // Name: Tom
    // Age: 15
    // Kind: cat

    在上述代碼中,我們定義了一個Animal類型的Iterator,并定義了一個名為i的內部狀態變量。該變量用于追蹤遍歷的進度,并決定下一個迭代器值的內容。最終成功打印了animal的全部信息。

    下面繼續我們的學習,定一個Animal向量并遍歷打印每一個Animal的所有屬性:

    fn print_all_attributes(animals: Vec<Animal>) {
        for mut animal in animals {
            println!("Name: {}", animal.next().unwrap());
            println!("Age: {}", animal.next().unwrap());
            println!("Kind: {}", animal.next().unwrap());
        }
    }
    fn main() {
        let animals = vec![Animal {
            name: "Tom".to_string(),
            age : 15,
            kind: "cat".to_string(),
            i : 0
        }];
        print_all_attributes(animals);
    }
    //  輸出結果:
    // Name: Tom
    // Age: 15
    // Kind: cat

    在上述代碼中,我們使用for循環來遍歷所有的Animal對象,并逐一打印它們的屬性。

    迭代器的常見用法

    map方法

    map方法是Iterator trait 中非常重要的一個方法,它可以讓我們對迭代器中的每一個元素進行轉換操作,并返回新的迭代器。例如:

    fn main() {
        let animals = vec![Animal {
            name: "Tom".to_string(),
            age : 15,
            kind: "cat".to_string(),
            i : 0
        }, Animal {
            name: "Jerry".to_string(),
            age : 7,
            kind: "mouse".to_string(),
            i : 0
        }];
        let list: Vec<String> = animals
            .into_iter()
            .map(|ani| ani.name.clone())
            .collect();
        println!("{:?}", list)
    }
    // 輸出 ["Tom", "Jerry"]

    上述代碼中,我們定義了一個包含2個的向量animals,并使用iter方法將其轉換為一個迭代器。然后,我們使用map方法對這個迭代器中的Animal的name操作,返回一個新的迭代器,并使用collect方法將其轉換為向量list。

    filter方法

    假設我們現在想尋找年齡大于等于3歲的動物,我們可以使用filter方法來實現。

    fn main() {
        let animals = vec![Animal {
            name: "Tom".to_string(),
            age : 15,
            kind: "cat".to_string(),
            i : 0
        }];
        let filtered_animals: Vec<Animal> = animals
            .into_iter()
            .filter(|animal| animal.age >= 3)
            .collect();
        println!("{:?}", filtered_animals)
    }
    //  輸出結果:
    //  [Animal { name: "Tom", age: 15, kind: "cat", i: 0 }]

    在上述代碼中,我們使用into_iter方法將Animal向量轉換為迭代器,并使用filter方法過濾其中年齡大于等于3歲的動物,最終返回一個新的Animal向量。

    enumerate方法

    enumerate方法會將一個迭代器中的元素和它們的索引配對,并返回一個新的迭代器。例如:

    fn main() {
        let animals = vec![Animal {
            name: "Tom".to_string(),
            age : 15,
            kind: "cat".to_string(),
            i : 0
        }, Animal {
            name: "Jerry".to_string(),
            age : 7,
            kind: "mouse".to_string(),
            i : 0
        }];
        for (i, animal) in animals.iter().enumerate() {
            println!("{}: {:?}", i, animal);
        }
    }
    // 輸出:
    // 0: Animal { name: "Tom", age: 15, kind: "cat", i: 0 }
    // 1: Animal { name: "Jerry", age: 7, kind: "mouse", i: 0 }

    上述代碼中,我們定義了一個包含2個Animal的向量animals,并使用iter方法將其轉換為一個迭代器。然后,我們使用enumerate方法將每Animal與其索引配對,并在for循環中打印出來。

    flat_map方法

    flat_map方法是Iterator trait 中比較少見的方法之一,它可以用于將嵌套的迭代器展開為單個迭代器。例如:

    #[derive(Debug, Clone)]
    struct Animal {
        name: String,
        age: u32,
        kind: String,
        i: i32,
    }
    fn main() {
        let cat = Animal {
            name: "Tom".to_string(),
            age: 15,
            kind: "cat".to_string(),
            i: 0,
        };
        let mouse = Animal {
            name: "Jerry".to_string(),
            age: 7,
            kind: "mouse".to_string(),
            i: 0,
        };
        let animals = vec![vec![cat], vec![mouse]];
        let list: Vec<Animal> = animals.iter().flat_map(|x| x.iter().cloned()).collect();
        println!("{:?}", list)
    }
    // 輸出 [Animal { name: "Tom", age: 15, kind: "cat", i: 0 }, Animal { name: "Jerry", age: 7, kind: "mouse", i: 0 }]

    上述代碼中,我們定義了一個二維向量animals,并使用iter方法將它轉換為迭代器。然后,我們使用flat_map方法將它展開為一個一維的迭代器,并使用collect方法將其轉換為向量list。

    zip方法

    如果我們需要同時遍歷兩個向量,我們可以使用zip方法進行配對。

    fn main() {
        let names = vec!["Tom", "Jerry", "Bob"];
        let ages = vec![3, 4, 5];
        for (name, age) in names.iter().zip(ages.iter()) {
              println!("{} is {} years old.", name, age);
        }
    }
    //    輸出結果:
    // Tom is 3 years old.
    // Jerry is 4 years old.
    // Bob is 5 years old.

    上述代碼中,我們使用iter方法將names和ages向量轉換為迭代器,并使用zip方法對它們進行配對。對于每一對元素,我們調用println!函數并打印它們。

    fold方法

    fold方法在Rust中也十分重要,它可以接受一個初始值和一個閉包,遍歷迭代器中的每一個元素,并將它們合并成單個值。例如:

    fn main() {
        let cat = Animal {
            name: "Tom".to_string(),
            age: 15,
            kind: "cat".to_string(),
            i: 0,
        };
        let mouse = Animal {
            name: "Jerry".to_string(),
            age: 7,
            kind: "mouse".to_string(),
            i: 0,
        };
        let animals = vec![cat, mouse];
        let sum = animals.iter().fold(0, |t, ani| t + ani.age );
        println!("{}", sum)
    }
    // 輸出 22

    上述代碼中,我們定義了一個包含2個Animal的向量animals,并使用iter方法將其轉換為一個迭代器。然后,我們使用fold方法對這個迭代器中的age進行累加,并返回結果sum。

    關于“Rust語言之Iterator迭代器怎么使用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Rust語言之Iterator迭代器怎么使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    巴东县| 普陀区| 怀集县| 亳州市| 洞头县| 二连浩特市| 丰县| 祥云县| 茌平县| 油尖旺区| 陆河县| 黄骅市| 浠水县| 赫章县| 延庆县| 宁远县| 西昌市| 新竹县| 潍坊市| 隆安县| 武功县| 麦盖提县| 鞍山市| 泗洪县| 武夷山市| 大邑县| 黄石市| 林州市| 阿鲁科尔沁旗| 监利县| 大余县| 东辽县| 泸水县| 湖北省| 太谷县| 贵阳市| 孟州市| 金平| 稻城县| 辽宁省| 蕉岭县|