字符串的相互转换

转换为字符串

将任何类型转换为 String 类型就像为该类型实现 ToString trait 一样简单。 您不应该直接这样做,而是应该实现 fmt::Display trait,它会自动提供 ToString,并且还允许像在 print! 部分中讨论的那样打印该类型。

use std::fmt;

struct Circle {
    radius: i32
}

impl fmt::Display for Circle {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "Circle of radius {}", self.radius)
    }
}

fn main() {
    let circle = Circle { radius: 6 };
    println!("{}", circle.to_string());
}

解析字符串

将字符串转换为多种类型很有用,但更常见的字符串操作之一是将它们从字符串转换为数字。 这种惯用的方法是使用 parse 函数,并安排类型推断或使用“涡轮鱼”语法指定要解析的类型。 以下示例中显示了两种替代方案。

只要该类型实现了 FromStr trait,这将把字符串转换为指定的类型。 标准库中为许多类型实现了该 trait。

fn main() {
    let parsed: i32 = "5".parse().unwrap();
    let turbo_parsed = "10".parse::<i32>().unwrap();

    let sum = parsed + turbo_parsed;
    println!("Sum: {:?}", sum);
}

要在用户自定义类型上获得此功能,只需为该类型实现 FromStr trait 即可。

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

#[derive(Debug)]
struct Circle {
    radius: i32,
}

impl FromStr for Circle {
    type Err = ParseIntError;
    fn from_str(s: &str) -> Result<Self, Self::Err> {
        match s.trim().parse() {
            Ok(num) => Ok(Circle{ radius: num }),
            Err(e) => Err(e),
        }
    }
}

fn main() {
    let radius = "    3 ";
    let circle: Circle = radius.parse().unwrap();
    println!("{:?}", circle);
}