Rust - Trình lặp lại và Đóng
Trong chương này, chúng ta sẽ tìm hiểu cách thức hoạt động của các trình vòng lặp và bao đóng trong RUST.
Trình lặp lại
Một trình lặp giúp lặp qua một tập hợp các giá trị như mảng, vectơ, bản đồ, v.v. Trình lặp thực hiện đặc điểm của Iterator được xác định trong thư viện tiêu chuẩn Rust. Phương thức iter () trả về một đối tượng trình lặp của tập hợp. Các giá trị trong một đối tượng trình lặp được gọi là các mục. Phương thức next () của trình vòng lặp có thể được sử dụng để duyệt qua các mục. Phương thức next () trả về giá trị None khi nó đến cuối tập hợp.
Ví dụ sau sử dụng một trình lặp để đọc các giá trị từ một mảng.
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());
}
Đầu ra
Iter([10, 20, 30])
Some(10)
Some(20)
Some(30)
None
Nếu một tập hợp như mảng hoặc Vector thực hiện đặc điểm Iterator thì nó có thể được duyệt qua bằng cú pháp for ... in như hình dưới đây-
fn main() {
let a = [10,20,30];
let iter = a.iter();
for data in iter{
print!("{}\t",data);
}
}
Đầu ra
10 20 30
3 phương thức sau đây trả về một đối tượng trình lặp từ một tập hợp, trong đó T đại diện cho các phần tử trong một tập hợp.
Sr.No | Phương pháp & Mô tả |
---|---|
1 | iter() cung cấp một trình lặp qua & T (tham chiếu đến T) |
2 | into_iter() cung cấp một trình lặp trên T |
3 | iter_mut() cung cấp một trình lặp qua & mut T |
Hình minh họa: iter ()
Hàm iter () sử dụng khái niệm vay mượn. Nó trả về một tham chiếu đến từng phần tử của bộ sưu tập, để bộ sưu tập không bị ảnh hưởng và có sẵn để sử dụng lại sau vòng lặp.
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
}
Đầu ra
Hello Kannan
There is a rustacean among us!
Hello Kiran
["Kannan", "Mohtashim", "Kiran"]
Hình minh họa - into_iter ()
Chức năng này sử dụng khái niệm quyền sở hữu. Nó di chuyển các giá trị trong bộ sưu tập vào một đối tượng iter, tức là bộ sưu tập đã được tiêu thụ và nó không còn khả dụng để sử dụng lại.
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
}
Đầu ra
Hello Kannan
There is a rustacean among us!
Hello Kiran
Hình minh họa - for and iter_mut ()
Hàm này giống như hàm iter () . Tuy nhiên, chức năng này có thể sửa đổi các phần tử trong bộ sưu tập.
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
}
Đầu ra
Hello Kannan
There is a rustacean among us!
Hello Kiran
["Kannan", "Mohtashim", "Kiran"]
Khép kín
Đóng cửa đề cập đến một chức năng trong một chức năng khác. Đây là những hàm ẩn danh - những hàm không có tên. Đóng cửa có thể được sử dụng để gán một hàm cho một biến. Điều này cho phép một chương trình truyền một hàm dưới dạng tham số cho các hàm khác. Đóng cửa còn được gọi là một hàm nội tuyến. Các biến trong hàm ngoài có thể được truy cập bằng các hàm nội tuyến.
Cú pháp: Định nghĩa một Đóng cửa
Định nghĩa bao đóng có thể có các tham số tùy chọn. Các thông số được bao trong hai thanh dọc.
let closure_function = |parameter| {
//logic
}
Cú pháp gọi một Closure triển khai Fncác tính trạng. Vì vậy, nó có thể được gọi bằng() cú pháp.
closure_function(parameter); //invoking
Hình minh họa
Ví dụ sau định nghĩa một hàm is_even trong hàm main () . Bao đóng trả về true nếu một số chẵn và trả về false nếu số lẻ.
fn main(){
let is_even = |x| {
x%2==0
};
let no = 13;
println!("{} is even ? {}",no,is_even(no));
}
Đầu ra
13 is even ? false
Hình minh họa
fn main(){
let val = 10;
// declared outside
let closure2 = |x| {
x + val //inner function accessing outer fn variable
};
println!("{}",closure2(2));
}
Hàm main () khai báo một biến val và một bao đóng. Bao đóng truy cập vào biến được khai báo trong hàm ngoài main () .
Đầu ra
12