String으로, String에서

문자열로 변환하기

어떤 타입을 String으로 변환하는 것은 ToString 트레잇을 타입에 구현하는 것 정도로 아주 간단합니다만, 이를 직접 하는 것보다는 ToString과 [print!]에서 다룬 타입 프린팅을 자동으로 제공하는 fmt::Display 트레잇을 구현해야 합니다.

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 함수를 사용하고 타입 추정으로 정형화하거나, 고속 파싱을 이용하는 것입니다. 두 방식 모두 아래에 잘 설명되어 있습니다.

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

    let sum = parsed + turbo_parsed;
    println!("Sum: {:?}", 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);
}