编程Rust 开发者

在 Rust 中,如何实现将字符串读取和解析为数字(例如,从 String 转换为 i32)?在使用 parse 方法时存在哪些潜在问题,如何正确处理转换错误?

用 Hintsage AI 助手通过面试

答案。

在 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> 来解析来自字符串的大数字,导致发生溢出错误。该错误在使用几周后才被发现,期间数据丢失。