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