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
如果像数组或向量这样的集合实现了迭代器特性,那么可以使用下面的for…in语法进行遍历,如下面所示-
fn main() {
let a = [10,20,30];
let iter = a.iter();
for data in iter{
print!("{}\t",data);
}
}
输出
10 20 30
以下三种方法从集合中返回一个迭代器对象,其中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 特性。因此,可以使用 () 语法来调用。
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