将& str类型转换为数字类型的最简洁方法是什么?

时间:2015-01-16 22:59:34

标签: type-conversion rust

我发现自己正在阅读大型CSV文件并将数字元素收集到Vec<&str>中。此后我必须将它们转换为数字类型,我发现这样做的最简单方法是实现这样的函数:

fn to_u32(str: &str) -> u32
{
    let str_num: Option<u32> = str.parse();
    match str_num
    {
        Some(num) => num,
        None      => panic!("Failed to read number"),
     }
 }

这似乎是一个相当常见的操作,所以我筛选了参考文档,但没有发现任何与之匹配的内容。有更清洁的方法吗?

2 个答案:

答案 0 :(得分:4)

Option类型具有多种适配器方法,可用于比重复match更好地处理数据。

例如,unwrapexpect只是从Some中提取数据,如果OptionNone则会感到恐慌。 expect方法实际上与您编写的代码最接近:str.parse().expect("Failed to read number.")


然而,使用其中列出的其他函数来传播错误,避免恐慌的“崩溃”,并允许用户(或您自己)更集中地处理错误并进行更多控制通常是有意义的。使用Result通常也是有意义的,这使您有机会在错误情况下传递更多信息,并且还允许使用the try! macro,即可以轻松定义相当于try!的{​​{1}}:

Option

答案 1 :(得分:2)

好吧,你可以使用unwrap()来避免模式匹配,但你应该谨慎地做 - 用unwrap()你无法处理实际的解析错误,所以如果字符串不代表数字,它会恐慌:

let str_num: u32 = str.parse().unwrap();

if let也是一个选项:

if let Some(str_num) = str.parse::<u32>() {
    // ...
}

如果您想指定一些默认值,也可以使用unwrap_or()

let str_num: u32 = str.parse().unwrap_or(42);

或者您可以使用unwrap_or_default() u32实例let str_num: u32 = str.parse().unwrap_or_default();

{{1}}