在 Rust 中,将字符串转换为数字的标准方法是 parse() 方法。它可以应用于实现了 FromStr trait 的类型,例如,将 String 或 &str 转换为 i32、f64 等。
示例:
let num: i32 = "42".parse().unwrap();
然而,在字符串不正确时将会出现错误(Result::Err)。重要的是通过 match 处理结果,以避免应用程序崩溃:
let input = "abc"; match input.parse::<i32>() { Ok(n) => println!("数字: {}", n), Err(e) => println!("解析错误: {}", e), }
parse 方法通过 "turbofish" (::<i32> )支持类型重载,如果类型不能被隐式推断的话。
问题: 可以在编译时不指定类型调用 .parse() 并获得正确的结果吗?
常见回答: 可以,如果字符串包含数字。
正确答案: 不可以,在编译时必须知道要转换成哪个类型。如果类型未可推断(例如,不再明确地使用),编译器将会报错。
错误代码示例:
let x = "10".parse(); // 错误:不清楚要解析成哪个类型
要修复,请使用 turbofish:
let x = "10".parse::<i32>().unwrap();
故事
在配置解析模块中,留下了 .parse().unwrap() 没有错误处理。用户设置中的一个拼写错误导致了 panic! 并停止了整个生产环境中的应用程序。
故事
在一个项目中,开发人员没有明确指定类型(未使用 turbofish),而中间变量未被使用,因此编译器无法推断类型,导致了编译时难以捕捉的错误。
故事
在项目中,由于意外使用 parse::<u8> 来解析来自字符串的大数字,导致发生溢出错误。该错误在使用几周后才被发现,期间数据丢失。