我正在尝试转换Vec<&str>
为Vec
但我无法找到一种功能性的方法来实现它.
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
.
您尚未完全指定问题.具体来说,当其中一个字符串无法解析为数字时会发生什么?使用时解析字符串中的数字时parse
,它可能会失败.这就是函数返回的原因Result
:
fn parse(&self) -> Result where F: FromStr,
这是一个解决方案,它接受向量,获取迭代器iter
,使用更改每个项目map
并最终返回Result
使用collect
.如果解析成功,你得到一个Ok
.如果有任何失败,你得到一个Err
:
fn main() { let input = "1,2,3"; let strings: Vec<_> = input.split(",").collect(); let numbers: Result, _> = strings.iter().map(|x| x.parse()).collect(); println!("{:?}", numbers); }
或者,您可以通过将以下内容Err
转换为flat_map
使用parse
然后过滤掉Result
值来删除失败的转换iter
:
fn main() { let input = "1,2,3"; let strings: Vec<_> = input.split(",").collect(); let numbers: Vec= strings.iter().flat_map(|x| x.parse()).collect(); println!("{:?}", numbers); }
当然,将字符串转换为字符串向量然后再将其转换为整数向量有点愚蠢.如果您实际上有逗号分隔的字符串并且想要数字,请一次性执行:
fn main() { let input = "1,2,3"; let numbers: Result, _> = input.split(",").map(|x| x.parse()).collect(); println!("{:?}", numbers); }
有一个迭代器适配器map
!你会这样使用它:
let bar: Vec= foo.split(",").map(|x| x.parse:: ().unwrap()).collect();
然后parse
是一个库函数,依赖于特征FromStr
,它可以返回一个错误,所以我们需要unwrap()
错误类型.(对于一个简短的例子,这是一个好主意,但在实际代码中,你需要正确处理错误 - 如果你有一个不在u16
那里的值,你的程序就会崩溃).
map
获取一个闭包,它按值获取参数,然后返回通过懒惰地应用该函数获得的迭代器.你在collect
这里得到了所有的值,但是如果你只是take(5)
它们,那么你只会解析其中的5个字符串.