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