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

What is the cleanest way to convert &str types to numeric types?

我发现自己在读取大型 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"),
     }
 }

这似乎是一个相当常见的操作,所以我仔细查看了参考文档,但没有找到任何与之匹配的内容。有更简洁的方法吗?

好吧,你可以使用 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() which employs Default 实例 u32:

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

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

例如,unwrap and expect 用于从 Some 中提取数据,如果 OptionNone,则恐慌。 expect方法其实最接近你写的代码:str.parse().expect("Failed to read number.").


但是,使用此处列出的其他函数传播错误、避免严重 "crash" 恐慌并允许用户(或您自己)更集中地处理错误通常是有意义的控制。使用 Result for this, which gives you the chance to pass along more information in the error case, and also allows one to use the try! macro 通常也很有意义,也就是说,可以很容易地为 Option:

定义等价的 try!
macro_rules! option_try {
    ($e: expr) => {
        match $e {
            Some(x) => x,
            None => return None
        }
    }
}