Rust-iterator-and-closure
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