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

问题描述 投票:4回答:3

我正在尝试将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

我需要将bar放入Vec<u16>

vector functional-programming rust
3个回答
8
投票

有一个迭代器适配器map!您可以这样使用它:

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

然后parse是一个库函数,依赖于特征FromStr,它可以返回错误,因此我们需要unwrap()错误类型。 (对于一个简短的示例,这是个好主意,但是在实际代码中,您将希望正确处理该错误-如果该值不存在u16,则程序将崩溃)。

map接受一个闭包,该闭包按值获取其参数,然后返回通过lazily应用该函数获得的迭代器。您正在collect解析所有值,但如果仅take(5)其中的值,则只会解析5个字符串。


9
投票

您尚未完全指定问题。具体而言,将字符串cannot中的一个解析为数字应该怎么办?使用parse从字符串中解析数字时,该数字可能会失败。这就是为什么函数返回parse

的原因
Result

这里是一个采用向量,使用fn parse<F>(&self) -> Result<F, F::Err> where F: FromStr 进行迭代,使用iter更改每个项目并最终使用iter返回map的解决方案。如果解析成功,则会得到map。如果any失败,则会得到Result

collect

或者您可以通过将collectOk转换为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); } 滤除Result值来删除失败的转换:

Option

当然,将字符串转换为字符串向量,然后再次将其转换为整数向量是[,这很愚蠢。如果您实际上有一个逗号分隔的字符串并想要数字,请一口气完成它:

ok

3
投票
我所认为的尚未真正在Rust中经历过的人。

ok

请注意,由于None返回一个filter_map,因此您必须从每个解析的元素中提取值。您可能想以其他方式行事,例如仅过滤成功的结果。
© www.soinside.com 2019 - 2024. All rights reserved.