Rust - Iterator dan Penutupan

Di bab ini, kita akan mempelajari cara kerja iterator dan closure di RUST.

Iterator

Sebuah iterator membantu untuk melakukan iterasi atas kumpulan nilai seperti array, vektor, peta, dll. Iterator mengimplementasikan sifat Iterator yang didefinisikan dalam pustaka standar Rust. Metode iter () mengembalikan objek iterator dari koleksi. Nilai dalam objek iterator disebut item. Metode next () dari iterator dapat digunakan untuk melintasi item. Metode next () mengembalikan nilai Tidak Ada saat mencapai akhir pengumpulan.

Contoh berikut menggunakan iterator untuk membaca nilai dari array.

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());
}

Keluaran

Iter([10, 20, 30])
Some(10)
Some(20)
Some(30)
None

Jika koleksi seperti larik atau Vektor mengimplementasikan sifat Iterator maka itu dapat dilintasi menggunakan for ... dalam sintaks seperti yang ditunjukkan di bawah ini-

fn main() {
   let a = [10,20,30];
   let iter = a.iter();
   for data in iter{
      print!("{}\t",data);
   }
}

Keluaran

10 20 30

3 metode berikut mengembalikan objek iterator dari koleksi, di mana T mewakili elemen dalam koleksi.

Sr Tidak Metode & Deskripsi
1

iter()

memberikan iterator di atas & T (referensi ke T)

2

into_iter()

memberikan iterator di atas T

3

iter_mut()

memberikan iterator & mut T

Ilustrasi: iter ()

Fungsi iter () menggunakan konsep peminjaman. Ini mengembalikan referensi ke setiap elemen koleksi, membiarkan koleksi tidak tersentuh dan tersedia untuk digunakan kembali setelah pengulangan.

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
}

Keluaran

Hello Kannan
There is a rustacean among us!
Hello Kiran
["Kannan", "Mohtashim", "Kiran"]

Ilustrasi - into_iter ()

Fungsi ini menggunakan konsep kepemilikan. Ini memindahkan nilai dalam koleksi ke objek iter, yaitu, koleksi dipakai dan tidak lagi tersedia untuk digunakan kembali.

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
}

Keluaran

Hello Kannan
There is a rustacean among us!
Hello Kiran

Ilustrasi - untuk dan iter_mut ()

Fungsi ini seperti fungsi iter () . Namun, fungsi ini dapat mengubah elemen di dalam koleksi.

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
}

Keluaran

Hello Kannan
There is a rustacean among us!
Hello Kiran
["Kannan", "Mohtashim", "Kiran"]

Penutupan

Penutupan mengacu pada fungsi dalam fungsi lain. Ini adalah fungsi anonim - fungsi tanpa nama. Penutupan dapat digunakan untuk menetapkan fungsi ke variabel. Ini memungkinkan program untuk melewatkan fungsi sebagai parameter ke fungsi lain. Penutupan juga dikenal sebagai fungsi sebaris. Variabel di fungsi luar dapat diakses dengan fungsi sebaris.

Sintaks: Mendefinisikan Penutupan

Definisi penutupan secara opsional dapat memiliki parameter. Parameter diapit dalam dua batang vertikal.

let closure_function = |parameter| {
   //logic
}

Sintaks yang meminta penerapan Penutupan Fnsifat. Jadi, bisa dipanggil dengan() sintaksis.

closure_function(parameter);    //invoking

Ilustrasi

Contoh berikut mendefinisikan closure is_even dalam fungsi main () . Closure mengembalikan nilai true jika sebuah bilangan genap dan mengembalikan false jika jumlahnya ganjil.

fn main(){
   let is_even = |x| {
      x%2==0
   };
   let no = 13;
   println!("{} is even ? {}",no,is_even(no));
}

Keluaran

13 is even ? false

Ilustrasi

fn main(){
   let val = 10; 
   // declared outside
   let closure2 = |x| {
      x + val //inner function accessing outer fn variable
   };
   println!("{}",closure2(2));
}

Fungsi main () mendeklarasikan val variabel dan penutupan. Penutupan mengakses variabel yang dideklarasikan di fungsi luar main () .

Keluaran

12