我想使用 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() {}
输出:
error[E0282]: type annotations needed
--> src/main.rs:10:8
|
10 | }).collect();
| ^^^^^^^ cannot infer type for `B`
最佳答案
fn collect<B>(self) -> B
where
B: FromIterator<Self::Item>
也就是说,它返回一个由调用者决定的类型。但是,您完全忽略了输出,因此无法推断类型。当代码基本上想使用 for
时,代码误用了 collect
。
在您的“固定”版本中(此版本已被编辑,使本段变得毫无意义),您在每次迭代中分配一个字符串的效率非常低。另外,除了函数上的类型之外,您不需要指定任何显式类型,您应该接受 &[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]));
}
关于iterator - 如何在 vec 上映射并在 Rust 中使用带有模式匹配的闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37839702/