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
    
    如果像 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 代表集合中的元素。
    序号 Methods & Description
    1
    iter()
    在 &T 上给出一个迭代器(对 T 的引用)
    2
    into_iter()
    给出 T 上的迭代器
    3
    iter_mut()
    给出一个迭代器 &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"]
    

    说明 - 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