如何以函数方式将字符串向量转换为整数向量?

Axu*_*aja 4 functional-programming vector rust

我正在尝试转换Vec<&str>Vec<u16>但我无法找到一种功能性的方法来实现它.

let foo: &str = "1,2,3"; // Parsing a string here
let bar: Vec<&str> = foo.split(",").collect(); // Bar is a nice vector of &str's
Run Code Online (Sandbox Code Playgroud)

我需要bar进入一个Vec<u16>.

She*_*ter 9

您尚未完全指定问题.具体来说,当其中一个字符串无法解析为数字时会发生什么?使用时解析字符串中的数字时parse,它可能会失败.这就是函数返回的原因Result:

fn parse<F>(&self) -> Result<F, F::Err>
where
    F: FromStr,
Run Code Online (Sandbox Code Playgroud)

这是一个解决方案,它接受向量,获取迭代器iter,使用更改每个项目map并最终返回Result使用collect.如果解析成功,你得到一个Ok.如果有任何失败,你得到一个Err:

fn main() {
    let input = "1,2,3";
    let strings: Vec<_> = input.split(",").collect();

    let numbers: Result<Vec<u16>, _> = strings.iter().map(|x| x.parse()).collect();

    println!("{:?}", numbers);
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以通过将以下内容Err转换为flat_map使用parse然后过滤掉Result值来删除失败的转换iter:

fn main() {
    let input = "1,2,3";
    let strings: Vec<_> = input.split(",").collect();

    let numbers: Vec<u16> = strings.iter().flat_map(|x| x.parse()).collect();

    println!("{:?}", numbers);
}
Run Code Online (Sandbox Code Playgroud)

当然,将字符串转换为字符串向量然后再将其转换为整数向量有点愚蠢.如果您实际上有逗号分隔的字符串并且想要数字,请一次性执行:

fn main() {
    let input = "1,2,3";

    let numbers: Result<Vec<u16>, _> = input.split(",").map(|x| x.parse()).collect();

    println!("{:?}", numbers);
}
Run Code Online (Sandbox Code Playgroud)


C. *_*ley 8

有一个迭代器适配器map!你会这样使用它:

let bar: Vec<u16> = foo.split(",").map(|x| x.parse::<u16>().unwrap()).collect();
Run Code Online (Sandbox Code Playgroud)

然后parse是一个库函数,依赖于特征FromStr,它可以返回一个错误,所以我们需要unwrap()错误类型.(对于一个简短的例子,这是一个好主意,但在实际代码中,你需要正确处理错误 - 如果你有一个不在u16那里的值,你的程序就会崩溃).

map获取一个闭包,它按值获取参数,然后返回通过懒惰地应用该函数获得的迭代器.你在collect这里得到了所有的值,但是如果你只是take(5)它们,那么你只会解析其中的5个字符串.