Daily Archives: 25/11/2017

Rust – Iterator

Iterator là một lớp đại diện cho các phần tử trong các kiểu dữ liệu danh sách như array, vector, slice… từ phần tử đầu tiên tới phần tử cuối cùng. Trong Rust, để lấy các đối tượng này thì chúng ta dùng phương thức next() trong các đối tượng danh sách.

Ví dụ:

fn main() {
let langs = ["Rust", "C++", "Java", "Python"];
let mut langs_iter = langs.iter();
println!("{:?}", langs_iter.next());
println!("{:?}", langs_iter.next());
println!("{:?}", langs_iter.next());
println!("{:?}", langs_iter.next());
println!("{:?"}. langs_iter.next());
}

Đầu tiên để lấy ra đối tượng Iterator thì chúng ta dùng hàm iter() có sẵn trong mảng. Sau đó để lấy phần tử tiếp theo trong Iterator thì chúng ta gọi hàm next(), hàm next() sẽ trả về đối tượng Some hoặc None chứ không phải là các giá trị thông thường.

Đối tượng Some sẽ được trả về khi Iterator vẫn lấy được giá trị, khi đã lấy ra phần tử cuối cùng trong danh sách thì hàm next() sẽ trả về đối tượng None.

Some("Rust")
Some("C++")
Some("Java")
Some("Python")
None

Iterator thường được dùng trong vòng lặp như sau:

fn main() {
let langs = ["Rust", "C++", "Java", "Python"];
for lang in langs.iter() {
println!("{}", lang);
}
}

Việc lặp thông qua Iterator giúp chúng ta tránh được một số lỗi như lỗi Index out of bound – tức lỗi chỉ số nằm ngoài phạm vi mảng.

Rust
C++
Java
Python

Ngoài việc dùng hàm iter() thì Rust có một cú pháp rút gọn khác là dùng kí tự & như sau:

fn main() {
let langs = ["Rust", "C++", "Java", "Python"];
for lang in &langs {
println!("{}", lang);
}
}

Chúng ta cũng có thể cho Iterator đi theo hướng từ cuối danh sách về đầu danh sách bằng cách gọi hàm rev() như sau:

fn main() {
let langs = ["Rust", "C++", "Java", "Python"];
for lang in langs.iter().rev() {
println!("{}", lang);
}
}

Python
Java
C++
Rust