Rust-iterator-and-closure

提供:Dev Guides
移動先:案内検索

Rust-イテレーターとクロージャー

この章では、イテレータとクロージャがRUSTでどのように機能するかを学習します。

イテレータ

イテレータは、配列、ベクトル、マップなどの値のコレクションを反復処理するのに役立ちます。 イテレータは、Rust標準ライブラリで定義されているイテレータ特性を実装します。 _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

配列やベクターなどのコレクションが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()

&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"]

閉鎖

クロージャとは、別の関数内の関数を指します。 これらは匿名関数です。名前のない関数です。 クロージャを使用して、関数を変数に割り当てることができます。 これにより、プログラムは関数をパラメーターとして他の関数に渡すことができます。 クロージャーはインライン関数としても知られています。 外部関数の変数には、インライン関数からアクセスできます。

構文:クロージャーの定義

クロージャー定義には、オプションでパラメーターを含めることができます。 パラメーターは2本の縦線で囲まれています。

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