📅  最后修改于: 2020-11-02 04:23:46             🧑  作者: Mango
在本章中,我们将学习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
如果类似array或Vector的集合实现了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表示集合中的元素。
Sr.No | Methods & Description |
---|---|
1 |
iter() gives an iterator over &T(reference to T) |
2 |
into_iter() gives an iterator over T |
3 |
iter_mut() gives an iterator over &mut T |
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"]
此函数使用所有权的概念。它将集合中的值移动到一个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
此函数类似于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
}
调用Closure的语法实现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