Any. Suppose we have an array or vector of values, and we want to see if a specific value is present in it. A for-loop could be used, but this requires several lines of code.
fn main() {
// Test array with any.
let values = ["bird", "frog", "dog", "cat"];
if values.iter().any(|&e| e == "dog") {
println!("DOG WAS FOUND");
}
if !values.iter().any(|&e| e == "lizard") {
println!("LIZARD WAS NOT FOUND");
}
// Test vector.
let test = vec!["abc", "", "DEF"];
if test.iter().any(|&e| e.is_empty()) {
println!("EMPTY ELEMENT FOUND");
}
}DOG WAS FOUND
LIZARD WAS NOT FOUND
EMPTY ELEMENT FOUND
Any benchmark. Does calling the any() function cause any slowdown in Rust programs? This can be quickly tested in an example benchmark program.
Version 1 This version of the code use the any() function to search the vector for an element matching X.
Version 2 Here we use a for-loop over the same vector, and we make sure to break when we find the matching element.
Result In most trial runs the 2 versions perform the same. There is no drawback to using any() for this kind of logic.
use std::time::*;
fn main() {
if let Ok(max) = "10000".parse::<usize>() {
let mut count = 0;
let mut values = vec![];
for _ in 0..1000 {
values.push("?");
}
values[500] = "X";
// Version 1: use any.
let t0 = Instant::now();
for _ in 0..max {
if values.iter().any(|&e| e == "X") {
count += 1;
}
}
println!("{} ms", t0.elapsed().as_millis());
// Version 2: use for-loop with break.
let t1 = Instant::now();
for _ in 0..max {
for &v in &values {
if v == "X" {
count += 1;
break;
}
}
}
println!("{} ms", t1.elapsed().as_millis());
println!("{count}");
}
}4 ms any
4 ms for, break
20000
A discussion. Functions like any() have sometimes been provided in languages, but have involved worse performance than for-loops. In Rust this does not appear to be the situation.
And With less code, and less logic to make mistakes with, the any() function is a good choice for searching a vector or array.
Detail With a slice, we have access to a contains() function. This may be a better option than calling any() to find a specific value.
Summary. There is no contains() function on an iterator. But the any() function can be used to implement "contains" with a small function argument.
Dot Net Perls is a collection of tested code examples. Pages are continually updated to stay current, with code correctness a top priority.
Sam Allen is passionate about computer languages. In the past, his work has been recommended by Apple and Microsoft and he has studied computers at a selective university in the United States.
This page was last updated on Jan 26, 2023 (edit link).