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

标签 iterator pattern-matching closures rust filtering

我想使用 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`

最佳答案

Iterator::collect定义为:

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/

相关文章:

Javascript 闭包性能

c++ - 遍历 C++ map<int, list<int>>

c++ - 前/后插入器就位

c++ - STL 不提供通过索引返回迭代器的函数有什么原因吗?

c++ - 多个查询的循环过早终止

javascript - 如何访问闭包内的变量

java - 从项目中提取数据的最佳方法

java - 高效地替换 ANTLRInputStream (ANTLRStringStream) 文件输入中的字符串或字符

pattern-matching - 为什么 Agda 中的模式匹配有时是 "essential"?

javascript - 如何在两个闭包之间共享数据而不暴露于全局?