如何在 Rust 中映射 vec 并使用带有模式匹配的闭包

xet*_*a11 4 closures iterator filtering pattern-matching rust

我想用来map迭代数组并对每个项目执行操作并摆脱 for 循环。我不明白的错误阻止了我的尝试。我想要实现的是迭代向量i32并匹配它们以将字符串与字符串文字连接起来,然后在最后返回它。

功能:

pub fn convert_to_rainspeak(prime_factors: Vec<i32>) -> String {
    let mut speak = String::new();
    prime_factors.iter().map(|&factor| {
        match factor {
            3 => { speak.push_str("Pling"); },
            5 => { speak.push_str("Plang"); },
            7 => { speak.push_str("Plong"); },
            _ => {}
        }
    }).collect();
    speak
}

fn main() {}
Run Code Online (Sandbox Code Playgroud)

输出:

pub fn convert_to_rainspeak(prime_factors: Vec<i32>) -> String {
    let mut speak = String::new();
    prime_factors.iter().map(|&factor| {
        match factor {
            3 => { speak.push_str("Pling"); },
            5 => { speak.push_str("Plang"); },
            7 => { speak.push_str("Plong"); },
            _ => {}
        }
    }).collect();
    speak
}

fn main() {}
Run Code Online (Sandbox Code Playgroud)

She*_*ter 5

Iterator::collect定义为:

fn collect<B>(self) -> B 
where
    B: FromIterator<Self::Item>
Run Code Online (Sandbox Code Playgroud)

也就是说,它返回一个由调用者决定的类型。但是,您完全忽略了输出,因此它无法推断类型。当代码collect基本上想使用时就会误用for.

在您的“固定”版本中(此后已被编辑,使本段毫无意义),在每次迭代中分配一个字符串的效率非常低。另外,除了函数上的类型之外,您不需要指定任何显式类型,并且您应该接受&[i32]

fn convert_to_rainspeak(prime_factors: &[i32]) -> String {
    prime_factors.iter()
        .map(|&factor| {
            match factor {
                3 => "Pling",
                5 => "Plang",
                7 => "Plong",
                _ => "",
            }
        })
        .collect()
}

fn main() {
    println!("{}", convert_to_rainspeak(&[1, 2, 3, 4, 5]));
}
Run Code Online (Sandbox Code Playgroud)