欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Rust語言從入門到精通系列之Iterator迭代器深入詳解

 更新時間:2023年04月20日 16:42:27   作者:TinyZzh  
這篇文章主要為大家介紹了Rust語言從入門到精通系列之Iterator迭代器深入詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

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

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

在本文中,我們將探討Rust語言中的迭代器的相關(guān)知識,并且以我們的老朋友Animal為例,提供相關(guān)的示例代碼。

熟悉Java的Stream和Lambda的同學(xué),學(xué)習(xí)本章節(jié)時,會格外的感覺“親切”。

迭代器的基本概念

迭代器是什么?

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

Iterator trait

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

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

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

Animal示例

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

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

我們可以在Animal上實現(xiàn)Iterator trait,使其可以通過for循環(huán)進行迭代。

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
    }
}

此時,我們已經(jīng)將我們的類型轉(zhuǎn)換為迭代器,我們就可以在它上面調(diào)用各種Iterator trait 的方法。例如,我們可以使用for循環(huán)遍歷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());
}
//  輸出結(jié)果:
// Name: Tom
// Age: 15
// Kind: cat

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

下面繼續(xù)我們的學(xué)習(xí),定一個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);
}
//  輸出結(jié)果:
// Name: Tom
// Age: 15
// Kind: cat

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

迭代器的常見用法

map方法

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

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方法將其轉(zhuǎn)換為一個迭代器。然后,我們使用map方法對這個迭代器中的Animal的name操作,返回一個新的迭代器,并使用collect方法將其轉(zhuǎn)換為向量list。

filter方法

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

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)
}
//  輸出結(jié)果:
//  [Animal { name: "Tom", age: 15, kind: "cat", i: 0 }]

在上述代碼中,我們使用into_iter方法將Animal向量轉(zhuǎn)換為迭代器,并使用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方法將其轉(zhuǎn)換為一個迭代器。然后,我們使用enumerate方法將每Animal與其索引配對,并在for循環(huán)中打印出來。

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方法將它轉(zhuǎn)換為迭代器。然后,我們使用flat_map方法將它展開為一個一維的迭代器,并使用collect方法將其轉(zhuǎn)換為向量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);
    }
}
//    輸出結(jié)果:
// Tom is 3 years old.
// Jerry is 4 years old.
// Bob is 5 years old.

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

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方法將其轉(zhuǎn)換為一個迭代器。然后,我們使用fold方法對這個迭代器中的age進行累加,并返回結(jié)果sum。

結(jié)論

迭代器是Rust語言中非常重要的數(shù)據(jù)類型,它們用于遍歷集合中的元素,并支持各種操作。在本教程中,我們探討了迭代器的基本概念和常見用法,以Animal為例子,提供了相應(yīng)的演示代碼。希望讀者能夠掌握Rust迭代器的相關(guān)內(nèi)容,并且在實際編程中得到應(yīng)用。

以上就是Rust語言從入門到精通系列之Iterator迭代器深入詳解的詳細內(nèi)容,更多關(guān)于Rust Iterator迭代器的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 利用rust實現(xiàn)一個命令行工具

    利用rust實現(xiàn)一個命令行工具

    這篇文章主要為大家詳細介紹了如何使用?Rust?和?clap?4.4.0?創(chuàng)建一個命令行工具?my_dev_tool,文中的示例代碼講解詳細,需要的小伙伴可以參考下
    2023-12-12
  • Rust控制流運算符match的用法詳解

    Rust控制流運算符match的用法詳解

    match 是Rust中一個極為強大的控制流運算符,用于模式匹配和控制流的選擇,它允許將一個值與一系列的模式相比較,根據(jù)匹配的模式執(zhí)行相應(yīng)代碼,本文給大家詳細介紹了Rust控制流運算符match的用法,需要的朋友可以參考下
    2024-01-01
  • Rust自定義安裝路徑的詳細圖文教程

    Rust自定義安裝路徑的詳細圖文教程

    工欲善其事必先利其器,無論是對小白還是大神來說,想要學(xué)習(xí) Rust 第一步那必須是 Rust 的環(huán)境配置,下面這篇文章主要給大家介紹了關(guān)于Rust自定義安裝路徑的詳細圖文教程,需要的朋友可以參考下
    2023-03-03
  • rust中的match表達式使用詳解

    rust中的match表達式使用詳解

    在rust中提供了一個極為強大的控制流運算符match,這篇文章主要介紹了rust中的match表達式,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • Rust中向量的學(xué)習(xí)筆記

    Rust中向量的學(xué)習(xí)筆記

    在Rust語言中,向量是一種動態(tài)數(shù)組類型,可以存儲相同類型的元素,并且可以在運行時改變大小,本文就來介紹一下Rust中向量,感興趣的可以了解一下
    2024-03-03
  • 從迷你todo?命令行入門Rust示例詳解

    從迷你todo?命令行入門Rust示例詳解

    這篇文章主要為大家介紹了從一個迷你todo命令行入門Rust的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Rust中的函數(shù)指針詳解

    Rust中的函數(shù)指針詳解

    Rust是一種現(xiàn)代的系統(tǒng)編程語言,它支持函數(shù)指針。函數(shù)指針是指向函數(shù)的指針,可以將函數(shù)作為參數(shù)傳遞給其他函數(shù)或存儲在變量中。Rust中的函數(shù)指針可以用于實現(xiàn)回調(diào)函數(shù)、動態(tài)分發(fā)和多態(tài)等功能。本文將介紹Rust中的函數(shù)指針的基本用法和高級用法。
    2023-05-05
  • Rust之Substrate框架中的pallet詳解

    Rust之Substrate框架中的pallet詳解

    Pallet是Substrate區(qū)塊鏈的基礎(chǔ)模塊,它定義了區(qū)塊鏈的業(yè)務(wù)邏輯和狀態(tài)轉(zhuǎn)換規(guī)則。開發(fā)人員可以使用現(xiàn)有的Pallet來快速構(gòu)建區(qū)塊鏈,也可以開發(fā)自定義的Pallet來實現(xiàn)特定的功能,感興趣的小伙伴可以參考閱讀下
    2023-05-05
  • 一步到位,教你如何在Windows成功安裝Rust

    一步到位,教你如何在Windows成功安裝Rust

    一步到位:輕松學(xué)會在Windows上安裝Rust!想快速掌握Rust編程語言?別再為復(fù)雜教程頭疼!這份指南將手把手帶你順利完成Windows平臺上的Rust安裝全過程,從此編碼之旅更加順暢無阻,立即閱讀,開始你的Rust編程旅程吧!
    2024-01-01
  • Rust多線程Web服務(wù)器搭建過程

    Rust多線程Web服務(wù)器搭建過程

    這篇文章主要介紹了Rust多線程 Web 服務(wù)器搭建過程,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04

最新評論