- Rust 教程
- Rust - 首頁
- Rust - 簡介
- Rust - 環境設定
- Rust - HelloWorld 示例
- Rust - 資料型別
- Rust - 變數
- Rust - 常量
- Rust - 字串
- Rust - 運算子
- Rust - 決策
- Rust - 迴圈
- Rust - 函式
- Rust - 元組
- Rust - 陣列
- Rust - 所有權
- Rust - 借用
- Rust - 切片
- Rust - 結構體
- Rust - 列舉
- Rust - 模組
- Rust - 集合
- Rust - 錯誤處理
- Rust - 泛型型別
- Rust - 輸入輸出
- Rust - 檔案輸入/輸出
- Rust - 包管理器
- Rust - 迭代器和閉包
- Rust - 智慧指標
- Rust - 併發
- Rust 有用資源
- Rust - 快速指南
- Rust - 有用資源
- Rust - 討論
Rust - 迭代器和閉包
本章我們將學習 Rust 中迭代器和閉包的工作原理。
迭代器
迭代器幫助迭代遍歷值的集合,例如陣列、向量、對映等。迭代器實現了在 Rust 標準庫中定義的 Iterator trait。`iter()` 方法返回集合的迭代器物件。迭代器物件中的值稱為專案。迭代器的 `next()` 方法可用於遍歷專案。當到達集合的末尾時,`next()` 方法返回 `None` 值。
下面的示例使用迭代器從陣列中讀取值。
fn main() {
//declare an array
let a = [10,20,30];
let mut iter = a.iter();
// fetch an iterator object for the array
println!("{:?}",iter);
//fetch individual values from the iterator object
println!("{:?}",iter.next());
println!("{:?}",iter.next());
println!("{:?}",iter.next());
println!("{:?}",iter.next());
}
輸出
Iter([10, 20, 30]) Some(10) Some(20) Some(30) None
如果像陣列或向量這樣的集合實現了 Iterator trait,那麼可以使用 for...in 語法進行遍歷,如下所示:
fn main() {
let a = [10,20,30];
let iter = a.iter();
for data in iter{
print!("{}\t",data);
}
}
輸出
10 20 30
以下 3 種方法從集合返回迭代器物件,其中 T 代表集合中的元素。
| 序號 | 方法和描述 |
|---|---|
| 1 | iter() 提供對 &T(T 的引用)的迭代器 |
| 2 | into_iter() 提供對 T 的迭代器 |
| 3 | iter_mut() 提供對 &mut T 的迭代器 |
示例:iter()
iter() 函式使用借用概念。它返回對集合中每個元素的引用,在迴圈結束後,集合保持不變並可重複使用。
fn main() {
let names = vec!["Kannan", "Mohtashim", "Kiran"];
for name in names.iter() {
match name {
&"Mohtashim" => println!("There is a rustacean among us!"),
_ => println!("Hello {}", name),
}
}
println!("{:?}",names);
// reusing the collection after iteration
}
輸出
Hello Kannan There is a rustacean among us! Hello Kiran ["Kannan", "Mohtashim", "Kiran"]
示例 - into_iter()
此函式使用所有權概念。它將集合中的值移動到 iter 物件中,即集合被消耗,不再可用。
fn main(){
let names = vec!["Kannan", "Mohtashim", "Kiran"];
for name in names.into_iter() {
match name {
"Mohtashim" => println!("There is a rustacean among us!"),
_ => println!("Hello {}", name),
}
}
// cannot reuse the collection after iteration
//println!("{:?}",names);
//Error:Cannot access after ownership move
}
輸出
Hello Kannan There is a rustacean among us! Hello Kiran
示例 - for 和 iter_mut()
此函式類似於 `iter()` 函式。但是,此函式可以修改集合中的元素。
fn main() {
let mut names = vec!["Kannan", "Mohtashim", "Kiran"];
for name in names.iter_mut() {
match name {
&mut "Mohtashim" => println!("There is a rustacean among us!"),
_ => println!("Hello {}", name),
}
}
println!("{:?}",names);
//// reusing the collection after iteration
}
輸出
Hello Kannan There is a rustacean among us! Hello Kiran ["Kannan", "Mohtashim", "Kiran"]
閉包
閉包指的是另一個函式內部的函式。它們是匿名函式——沒有名稱的函式。閉包可以用於將函式分配給變數。這允許程式將函式作為引數傳遞給其他函式。閉包也稱為行內函數。外部函式中的變數可以被行內函數訪問。
語法:定義閉包
閉包定義可以選擇具有引數。引數包含在兩個豎線之間。
let closure_function = |parameter| {
//logic
}
呼叫閉包的語法實現 **Fn** trait。因此,它可以用 **()** 語法呼叫。
closure_function(parameter); //invoking
示例
下面的示例在 `main()` 函式中定義了一個閉包 `is_even`。如果數字是偶數,則閉包返回 true;如果數字是奇數,則返回 false。
fn main(){
let is_even = |x| {
x%2==0
};
let no = 13;
println!("{} is even ? {}",no,is_even(no));
}
輸出
13 is even ? false
示例
fn main(){
let val = 10;
// declared outside
let closure2 = |x| {
x + val //inner function accessing outer fn variable
};
println!("{}",closure2(2));
}
`main()` 函式聲明瞭一個變數 `val` 和一個閉包。閉包訪問在外部函式 `main()` 中宣告的變數。
輸出
12