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

如果像数组或向量这样的集合实现了迭代器特性,那么可以使用下面的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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程