我正在尝试将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>
。
有一个迭代器适配器map
!您可以这样使用它:
let bar : Vec<u16> = foo.split(",").map(|x| x.parse::<u16>().unwrap()).collect();
然后parse
是一个库函数,依赖于特征FromStr
,它可以返回错误,因此我们需要unwrap()
错误类型。 (对于一个简短的示例,这是个好主意,但是在实际代码中,您将希望正确处理该错误-如果该值不存在u16
,则程序将崩溃)。
map
接受一个闭包,该闭包按值获取其参数,然后返回通过lazily应用该函数获得的迭代器。您正在collect
解析所有值,但如果仅take(5)
其中的值,则只会解析5个字符串。
您尚未完全指定问题。具体而言,将字符串cannot中的一个解析为数字应该怎么办?使用parse
从字符串中解析数字时,该数字可能会失败。这就是为什么函数返回parse
:
Result
这里是一个采用向量,使用fn parse<F>(&self) -> Result<F, F::Err>
where F: FromStr
进行迭代,使用iter
更改每个项目并最终使用iter
返回map
的解决方案。如果解析成功,则会得到map
。如果any失败,则会得到Result
:
collect
或者您可以通过将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);
}
滤除Result
值来删除失败的转换:
Option
当然,将字符串转换为字符串向量,然后再次将其转换为整数向量是[
ok
ok
请注意,由于None
返回一个filter_map
,因此您必须从每个解析的元素中提取值。您可能想以其他方式行事,例如仅过滤成功的结果。