Iterator::any
Iterator::any は、イテレータを渡すと、いずれかの要素が述語を満たす場合に true を返す関数です。それ以外の場合は false です。そのシグネチャは次のとおりです。
pub trait Iterator {
// イテレートされる型。
type Item;
// `any` は `&mut self` を取ります。これは呼び出し元を借用して
// 変更できるが、消費はできないことを意味します。
fn any<F>(&mut self, f: F) -> bool where
// `FnMut` は、キャプチャされた変数が最大でも
// 変更されるだけで、消費されないことを意味します。`Self::Item` はクロージャのパラメータ型で、
// イテレータによって決まります(例: `.iter()` では `&T`、
// `.into_iter()` では `T`)。
F: FnMut(Self::Item) -> bool;
}
fn main() { let vec1 = vec![1, 2, 3]; let vec2 = vec![4, 5, 6]; // vec の `iter()` は `&i32` を生成します。`i32` に分解します。 println!("2 in vec1: {}", vec1.iter() .any(|&x| x == 2)); // vec の `into_iter()` は `i32` を生成します。分解は不要です。 println!("2 in vec2: {}", vec2.into_iter().any(|x| x == 2)); // `iter()` は `vec1` とその要素を借用するだけなので、再び使用できます println!("vec1 len: {}", vec1.len()); println!("First element of vec1 is: {}", vec1[0]); // `into_iter()` は `vec2` とその要素をムーブするため、再び使用することはできません // println!("First element of vec2 is: {}", vec2[0]); // println!("vec2 len: {}", vec2.len()); // TODO: 上の 2 行のコメントを解除して、コンパイラエラーを確認してください。 let array1 = [1, 2, 3]; let array2 = [4, 5, 6]; // 配列の `iter()` は `&i32` を生成します。 println!("2 in array1: {}", array1.iter() .any(|&x| x == 2)); // 配列の `into_iter()` は `i32` を生成します。 println!("2 in array2: {}", array2.into_iter().any(|x| x == 2)); }