迭代器和闭包
在本章中,我们将学习迭代器和闭包在 RUST 中的工作原理。
迭代器
迭代器有助于迭代数组、向量、映射等值的集合。迭代器实现了 Rust 标准库中定义的迭代器特征。 iter() 方法返回集合的迭代器对象。 迭代器对象中的值称为项目。 迭代器的 next() 方法可用于遍历项目。 next() 方法在到达集合末尾时返回值 None。
以下示例使用迭代器从数组中读取值。
fn main() {
//声明一个数组
let a = [10,20,30];
let mut iter = a.iter();
// 获取数组的迭代器对象
println!("{:?}",iter);
//从迭代器对象中获取单个值
println!("{:?}",iter.next());
println!("{:?}",iter.next());
println!("{:?}",iter.next());
println!("{:?}",iter.next());
}
输出
Iter([10, 20, 30]) Some(10) Some(20) Some(30) None
如果像数组或 Vector 这样的集合实现了 Iterator 特征,那么可以使用 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 表示集合中的元素。
| Sr.No | 方法与描述 |
|---|---|
| 1 | iter() 给出 &T 上的迭代器(对 T 的引用) |
| 2 | into_iter() 给出 T 上的迭代器 |
| 3 | iter_mut() 给出 &mut T 上的迭代器 |
Illustration: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);
// 迭代后重用集合
}
输出
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),
}
}
// 迭代后无法重用集合
// 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);
//// 迭代后重用集合
}
输出
Hello Kannan There is a rustacean among us! Hello Kiran ["Kannan", "Mohtashim", "Kiran"]
闭包
闭包是指一个函数包含在另一个函数中。 这些是匿名函数——没有名称的函数。 闭包可用于将函数分配给变量。 这允许程序将函数作为参数传递给其他函数。 闭包也称为内联函数。 外部函数中的变量可以通过内联函数访问。
语法:定义闭包
闭包定义可以选择包含参数。 参数包含在两个竖线内。
let closure_function = |parameter| {
//logic
}
调用闭包的语法实现 Fn 特征。 因此,可以使用 () 语法调用它。
closure_function(parameter); //调用
示例
以下示例在函数 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;
// 对外声明
let closure2 = |x| {
x + val // 内部函数访问外部 fn 变量
};
println!("{}",closure2(2));
}
main()函数声明一个变量val和一个闭包。 闭包访问在外部函数 main() 中声明的变量。
输出
12