Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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));
}

関連項目:

std::iter::Iterator::any