functional-programming - 如何使用函数式样式将字符串解析为 float 列表?

标签 functional-programming rust

我正在尝试将字符串解析为 Rust 中的浮点值列表。我假设有一种聪明的方法可以使用迭代器和 Option 来做到这一点;但是,我无法让它忽略 parse() 调用失败导致的 Err 值。 Rust 教程似乎没有涵盖任何此类示例,文档充其量也令人困惑。

我将如何使用函数式向量/列表操作来实现它?为我的迭代实现提供更好的 Rust 风格的指针也将不胜感激!

“功能性”风格

遇到Err 时出现 panic

input.split(" ").map(|s| s.parse::<f32>().unwrap()).collect::<Vec<_>>()

迭代式

按预期忽略非浮点值

fn parse_string(input: &str) -> Vec<f32> {
    let mut vals = Vec::new();
    for val in input.split_whitespace() {
        match val.parse() {
            Ok(v) => vals.push(v),
            Err(_) => (),
        }
    }
    vals
}

fn main() {
    let params = parse_string("1 -5.2  3.8 abc");
    for &param in params.iter() {
        println!("{:.2}", param);
    }
}

最佳答案

filter_map做你想做的,转换值并过滤掉 Nones:

input.split(" ").filter_map(|s| s.parse::<f32>().ok()).collect::<Vec<_>>();

注意 ok 方法将 Result 转换为 Option

关于functional-programming - 如何使用函数式样式将字符串解析为 float 列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19507730/

相关文章:

Haskell - 函数不适用于无限列表

Lambda演算表达式实现函数应用

java - 我可以按元素的类过滤 Stream<T> 并一步获得 Stream<U> 吗?

module - 我可以在不为每个文件引入模块的情况下将 crate 拆分为多个文件吗?

rust - 如何在 Rust 中返回结果数据类型?

iterator - 是否可以就地过滤矢量?

javascript - Object.create 不创建属性

javascript - 如何使用 let 声明作为表达式?

rust - 是否可以仅为 Release模式调用 build.rs?

rust - 如何在程序宏中接受语法上无效的输入?