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)
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)