我发现自己正在阅读大型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"),
}
}
这似乎是一个相当常见的操作,所以我筛选了参考文档,但没有发现任何与之匹配的内容。有更清洁的方法吗?
答案 0 :(得分:4)
Option
类型具有多种适配器方法,可用于比重复match
更好地处理数据。
例如,unwrap
和expect
只是从Some
中提取数据,如果Option
是None
则会感到恐慌。 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}}