在 Rust 中将 String 转换为 int 的完整指南(附示例)

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么 Rust 不允许直接转换字符串为数字?



如果您来自 Python 或 JavaScript,您可能习惯了类似 int("42") 或 parseInt("42") 的神奇操作。但在 Rust 中,这种技巧行不通——编译器会要求您明确指定要将字符串转换为哪种具体类型。为什么?因为 Rust 是一种不容忍疏忽的语言。它迫使您考虑边界情况:如果字符串中包含非数字字符怎么办?如果数字对于所选类型来说太大怎么办?



在本文中,我们将剖析 Rust 初学者在 Stack Overflow 上最常问的问题:如何将 String 转换为 int。您将获得的不仅是现成的代码,还有对底层机制的全方位理解。



parse() 方法——转换的主要工具



在 Rust 中,将字符串转换为数字的主要方法是 parse(),它适用于 String 和 &str 类型。该方法通过 FromStr trait 实现,并返回 Result<T, E>。



基础示例:String → i32



fn main() {    let number_string = String::from("42");    let number: i32 = number_string.parse().unwrap();    println!("数字: {}", number); // 输出: 数字: 42}


请注意 unwrap()。这是一种从 Result 中“取出”值的快速方法,但它有风险:如果字符串不是数字,程序将 panic 并崩溃。



正确的错误处理



在实际代码中,您绝不应盲目使用 unwrap()。以下是正确的做法:



use std::num::ParseIntError;

fn main() { let input = String::from("hello"); match input.parse::<i32>() { Ok(number) => println!("成功: {}", number), Err(e) => println!("转换错误: {}", e), }}


或者使用更简洁的 if let 版本:



fn main() {    let input = String::from("2024");        if let Ok(year) = input.parse::<i32>() {        println!("年份: {}", year);    } else {        println!("无法解析字符串");    }}


可用于转换的整数类型



Rust 提供了丰富的整数类型。您可以将字符串转换为其中任何一种:



  • i8, i16, i32, i64, i128 — 有符号整数
  • u8, u16, u32, u64, u128 — 无符号整数
  • isize, usize — 大小取决于架构


转换为不同类型的示例:



fn main() {    let val = "255";        let a: u8  = val.parse().unwrap();   // 255    let b: i16 = val.parse().unwrap();   // 255    let c: u32 = val.parse().unwrap();   // 255        // 下面这样会出错——255 超出了 i8 的范围    // let d: i8 = val.parse().unwrap(); // PANIC!}


进阶技巧:from_str 和自定义类型



parse() 方法内部会调用 FromStr trait 中的 from_str()。您可以为自己的结构体实现这个 trait:



use std::str::FromStr;use std::num::ParseIntError;

#[derive(Debug)]struct Version { major: u32, minor: u32,}

impl FromStr for Version { type Err = ParseIntError; fn from_str(s: &str) -> Result<Self, Self::Err> { let parts: Vec<&str> = s.split('.').collect(); if parts.len() != 2 { // 创建自定义错误,但此处示例使用 ParseIntError return Err("1.0".parse::<u32>().unwrap_err()); } let major = parts[0].p

博客

书籍推荐