当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何以函数方式将字符串向量转换为整数向量?》经验,为你挑选了2个好方法。

我正在尝试转换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.



1> Shepmaster..:

您尚未完全指定问题.具体来说,当其中一个字符串无法解析为数字时会发生什么?使用时解析字符串中的数字时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);
}



2> C. Quilley..:

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

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

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

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

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有