Iterator::any
Iterator::any
là một hàm khi được truyền một iterator(trình vòng lặp), sẽ trả về true
nếu có bất kỳ phần tử nào thỏa mãn mệnh đề. Nếu không thì false
. Điểm nhấn của nó:
#![allow(unused)] fn main() { pub trait Iterator { // Kiểu lặp đi lặp lại. type Item; // `any` truyền `&mut self` có nghĩa là người gọi có thể mượn và sửa đổi giá trị, // nhưng không thể tiêu thụ nó. fn any<F>(&mut self, f: F) -> bool where // `FnMut` có nghĩa là bất kì biến nào được chụp nhiều nhất có thể được sửa đổi, không được sử dụng. // `&Self::Item` cho biết nó đưa các đối số vào closure bằng giá trị. F: FnMut(Self::Item) -> bool; } }
fn main() { let vec1 = vec![1, 2, 3]; let vec2 = vec![4, 5, 6]; // `Phương thức iter() cho `vecs trả về kiểu `&i32`. Destructure thành `i32`. println!("2 in vec1: {}", vec1.iter() .any(|&x| x == 2)); // Phương thức `into_iter()` cho vecs trả về kiểu `i32`. Không yêu cầu Destructure. println!("2 in vec2: {}", vec2.into_iter().any(|x| x == 2)); // Phương thức `iter()` chỉ mượn `vec1` và phần tử của nó, vì thế họ có thể sử dụng lại. println!("vec1 len: {}", vec1.len()); println!("First element of vec1 is: {}", vec1[0]); // Phương thức `into_iter()` chuyển `vec2` và các phần tử của nó, vì thế chúng // không thể được sử dụng lại // println!("First element of vec2 is: {}", vec2[0]); // println!("vec2 len: {}", vec2.len()); // TODO: Thử không comment hai dòng trên và xem biên dịch lỗi.. let array1 = [1, 2, 3]; let array2 = [4, 5, 6]; // Phương thức `iter()` cho mảng trả về kiểu `&i32`. println!("2 in array1: {}", array1.iter() .any(|&x| x == 2)); // Phương thức `into_iter()` cho mảng trả về kiểu `i32`. println!("2 in array2: {}", array2.into_iter().any(|x| x == 2)); }