🦀

RustのIterator: anyとfindの違い

2023/11/06に公開

RustのIteratorトレイトは、コレクションの要素を検査するための強力なメソッドを提供しています。その中でもよく使われるのがanyメソッドとfindメソッドですが、これら二つのメソッドは異なる目的で使用されます。

anyメソッド

anyメソッドは、イテレータを介してコレクションの各要素に対して指定した条件をテストします。もし条件を満たす要素が一つでもあれば、trueを返し、そうでなければfalseを返します。このメソッドは、特定の条件を満たす要素がコレクションに存在するかどうかを確認する際に便利です。

例:

let numbers = vec![1, 2, 3, 4, 5];
let has_even = numbers.iter().any(|&x| x % 2 == 0); // 偶数が含まれているため、trueを返す

findメソッド

一方で、findメソッドは、イテレータの各要素に対して指定した条件をテストし、条件を満たす最初の要素をSomeでラップして返します。条件を満たす要素が一つもなければNoneを返します。findは、条件に合致する具体的な要素を見つけ出す必要があるときに使用されます。

例:

Copy code
let numbers = vec![1, 2, 3, 4, 5];
let first_even = numbers.iter().find(|&&x| x % 2 == 0); // Some(&2)を返す。2が最初の偶数のため。

要約

anyはブール値を返し、条件を満たす要素の存在をチェックします。
findはオプション値を返し、条件に合致する最初の要素そのものを見つけます。

どちらのメソッドもイテレータを消費しますが、条件を満たす要素が見つかった時点でイテレーションを停止するという短絡評価の性質があります。これにより、パフォーマンスを向上させることができます。

参考記事

Iterator::any
Searching through iterators

Discussion