String 类型转换 - Rust By Example
Description: Rust by Example (RBE) is a collection of runnable examples that illustrate various Rust concepts and standard libraries.

## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# String 类型转换

## 转换为字符串

要将任何类型转换为 `String`，只需为该类型实现 `ToString` 特质即可。但更好的做法是实现 `fmt::Display` 特质，它不仅会自动提供 `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, "半径为 {} 的圆", self.radius)
        }
    }

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

## 解析字符串

将字符串转换为其他类型很有用，其中最常见的操作之一是将字符串转换为数字。惯用的方法是使用 `parse` 函数，可以通过类型推断或使用“涡轮鱼“语法指定要解析的类型。以下示例展示了这两种方法。

只要为目标类型实现了 `FromStr` 特质，就可以将字符串转换为指定的类型。标准库中为许多类型实现了这个特质。

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

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

要在自定义类型上获得这个功能，只需为该类型实现 `FromStr` 特质。

    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);
    }