Rust 提供了方便的标准工具,通过 FromStr trait 将字符串转换为数字。最常用的方法是 .parse::<T>(),可以在字符串和切片上调用。
在许多语言中,将字符串转换为数字是一项常见任务,但在 Rust 中,它的实现尽可能安全和透明,错误处理是标准库的一部分合约,而不是运行时异常。
.parse::<T>() 返回结果类型为 Result<T, ParseIntError>(或其他类型的类似类型),这就要求显式处理失败情况。一个常见错误是忽略错误的可能性,使用 unwrap() 而不进行分析,这可能导致程序在输入数据不正确时崩溃,而不是返回正确的错误信息。
要将字符串转换为数字,可以使用 parse 方法。它的签名是:
let num: i32 = "42".parse().unwrap();
但更正确的做法是处理错误:
let s = "abc"; match s.parse::<i32>() { Ok(n) => println!("获得的数字: {}", n), Err(e) => println!("解析错误: {e}"), }
关键特点:
FromStr,但具体限制是不明确的:空格、符号、溢出处理方式各不相同Result 返回,而不是通过 panic 或异常FromStr 的类型(包括自定义类型)都可以成为 .parse() 的目标可以在不指定结果类型的情况下使用 parse 吗?
不可以,不指定类型(或未隐式推导类型)时,Rust 会报错,因为它无法理解转换为哪个类型。
如果试图将非数字内容的字符串解析为数字,会发生什么?
该方法会返回错误 (Err(...)),不会引发 panic。错误实现了 Debug trait,便于输出。
let num: Result<u32, _> = "not_a_number".parse(); assert!(num.is_err());
如果确定内容,可以在 parse 后使用 unwrap 吗?
从技术上讲可以,但这是一种反模式。如果字符串意外无效,程序将崩溃。
unwrap() 而不处理错误trim 清理用户输入parse::<String>()) 而不是目标数字类型控制台工具从用户那里读取数字并使用 .parse().unwrap()。在偶然输入错误时,程序会突然崩溃,用户不理解原因。
优点:
缺点:
首先清理输入的空格,然后在匹配情况下使用 parse,或者在需要时使用 map_err 返回自己的错误。错误被正确处理,并提供清晰的错误消息。
优点:
缺点: