如何检查一个物体是否在向量中?
let n= vec!["-i","mmmm"]; if "-i" in n { println!("yes"); } else { println!("no");
我猜我需要把它放在一个循环中,然后执行if "-i" in x,其中x是iter var。但我希望有一个方便的方法可用,或者我混淆了语法,有一个类似的方法来做到这一点。
if "-i" in x
x
fnx2tebb1#
Vec上有contains(https://doc.rust-lang.org/std/vec/struct.Vec.html#method.contains)方法。示例:
Vec
contains
let n = vec!["-i","mmmm"]; if n.contains(&"-i") { println!("yes"); } else { println!("no"); }
它有点像restrictive,例如,如果x的类型是&str,它不允许检查Vec<String>是否包含x。在这种情况下,必须使用@harmic描述的.iter().any(...)方法
&str
Vec<String>
.iter().any(...)
wljmcqd82#
虽然可以构造循环,但更简单的方法是在向量的迭代器上使用any方法。any接受一个闭包,返回true或false。依次为每个项调用闭包,直到找到返回true的项。请注意,迭代器返回对值的引用(因此|&i|中的&)。
any
|&i|
&
let n= vec!["-i","mmmm"]; if n.iter().any(|&i| i=="-i") { println!("Yes"); }
由于any对迭代器进行操作,因此它可以用于任何类型的容器。在迭代器上有大量类似的方法,如all、find等。请参阅Iterators的标准库文档。
all
find
Iterators
vh0rcniy3#
给定Linux发行版名称的DISTRO_NAMES数组。所以要检查发行版(字符串)是否存在并行人造丝搜索。
use rayon::prelude::*; // Cargo.toml: rayon = "1.7.0" use std::error::Error; pub const DISTRO_NAMES: [&str; 20] = [ "Arch", "Debian", "Ubuntu", "Deepin", "Tails", "Fedora", "Slackware", "Manjaro", "Mint", "Kali", "Puppy", "OpenSUSE", "Lite", "MX", "CentOS", "Zorin", "Oracle", "Elementary", "Raspbian", "Pop", ]; /// Parallel rayon search pub fn get_distro_index(name: &str) -> Option<usize> { DISTRO_NAMES .par_iter() .enumerate() .find_map_any(|(index, distro)| { // if &name == distro { if name.to_lowercase().contains(&distro.to_lowercase()) { Some(index) } else { None } }) } fn main() -> Result<(), Box<dyn Error>> { let names = vec![ "Arch Linux Rolling Release", "Foo Bar", "manjaro linux", "Foo Bar Baz", "Tails", ]; for name in names { if let Some(index) = get_distro_index(name) { println!("'{name}' found as '{}'", DISTRO_NAMES[index]); } } Ok(()) }
看到这个Rust Playground输出:
'Arch Linux Rolling Release' found as 'Arch' 'manjaro linux' found as 'Manjaro' 'Tails' found as 'Tails'
3条答案
按热度按时间fnx2tebb1#
Vec
上有contains
(https://doc.rust-lang.org/std/vec/struct.Vec.html#method.contains)方法。示例:
它有点像restrictive,例如,如果
x
的类型是&str
,它不允许检查Vec<String>
是否包含x
。在这种情况下,必须使用@harmic描述的.iter().any(...)
方法wljmcqd82#
虽然可以构造循环,但更简单的方法是在向量的迭代器上使用
any
方法。any
接受一个闭包,返回true或false。依次为每个项调用闭包,直到找到返回true的项。请注意,迭代器返回对值的引用(因此|&i|
中的&
)。由于
any
对迭代器进行操作,因此它可以用于任何类型的容器。在迭代器上有大量类似的方法,如all
、find
等。请参阅Iterators
的标准库文档。vh0rcniy3#
给定Linux发行版名称的DISTRO_NAMES数组。
所以要检查发行版(字符串)是否存在并行人造丝搜索。
看到这个Rust Playground
输出: