rust 我如何检查一个东西是否在向量中

yuvru6vn  于 2023-06-06  发布在  其他
关注(0)|答案(3)|浏览(169)

如何检查一个物体是否在向量中?

let n= vec!["-i","mmmm"];
if "-i" in n { 
    println!("yes");
} else {
    println!("no");

我猜我需要把它放在一个循环中,然后执行if "-i" in x,其中x是iter var。但我希望有一个方便的方法可用,或者我混淆了语法,有一个类似的方法来做到这一点。

fnx2tebb

fnx2tebb1#

Vec上有contains(https://doc.rust-lang.org/std/vec/struct.Vec.html#method.contains)方法。
示例:

let n = vec!["-i","mmmm"];

if n.contains(&"-i") { 
    println!("yes");
} else {
    println!("no");
}

它有点像restrictive,例如,如果x的类型是&str,它不允许检查Vec<String>是否包含x。在这种情况下,必须使用@harmic描述的.iter().any(...)方法

wljmcqd8

wljmcqd82#

虽然可以构造循环,但更简单的方法是在向量的迭代器上使用any方法。
any接受一个闭包,返回true或false。依次为每个项调用闭包,直到找到返回true的项。请注意,迭代器返回对值的引用(因此|&i|中的&)。

let n= vec!["-i","mmmm"];

if n.iter().any(|&i| i=="-i") {
    println!("Yes");
}

由于any对迭代器进行操作,因此它可以用于任何类型的容器。在迭代器上有大量类似的方法,如allfind等。请参阅Iterators的标准库文档。

vh0rcniy

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'

相关问题