1.2.3 Formatting

형식 문자 에 의해 형식이 지정되는 것을 보았었다. We've seen that formatting is specified via a format string:

  • format!("{}", foo) -> "3735928559"
  • format!("0x{:X}", foo) -> "0xDEADBEEF"
  • format!("0o{:o}", foo) -> "0o33653337357"

동일한 변수(foo)는 사용되는 인자 타입: X vs o vs 무기입 에 따라 다른 형식을 갖을 수 있다. The same variable (foo) can be formatted differently depending on which argument type is used: X vs o vs unspecified.

이런 형식 기능은 trait으로 구현되고 각 인자 타입마다 하나의 trait이 존재한다. 가장 범용적인 형식화 trait은 Display으로 이는 왼편이 무기재된: {}처럼 경우를 처리한다. This formatting functionality is implemented via traits, and there is one trait for each argument type. The most common formatting trait is Display, which handles cases where the argument type is left unspecified: {} for instance.

use std::fmt::{self, Formatter, Display};

struct City {
    name: &'static str,
    // 위도
    lat: f32,
    // 경도
    lon: f32,
}

impl Display for City {
    // `f`는 버퍼로 이 메소드는 반드시 여기에 형식화된 문자를 써야한다.
    // `f` is a buffer, this method must write the formatted string into it
    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
        let lat_c = if self.lat >= 0.0 { 'N' } else { 'S' };
        let lon_c = if self.lon >= 0.0 { 'E' } else { 'W' };

        // `write!`는 `format!`과 유사하지만 버퍼(첫번째 인수)에 형식화 문자를 쓴다.
        // `write!` is like `format!`, but it will write the formatted string
        // into a buffer (the first argument)
        write!(f, "{}: {:.3}°{} {:.3}°{}",
               self.name, self.lat.abs(), lat_c, self.lon.abs(), lon_c)
    }
}

#[derive(Debug)]
struct Color {
    red: u8,
    green: u8,
    blue: u8,
}

fn main() {
    for city in [
        City { name: "Dublin", lat: 53.347778, lon: -6.259722 },
        City { name: "Oslo", lat: 59.95, lon: 10.75 },
        City { name: "Vancouver", lat: 49.25, lon: -123.1 },
    ].iter() {
        println!("{}", *city);
    }
    for color in [
        Color { red: 128, green: 255, blue: 90 },
        Color { red: 0, green: 3, blue: 254 },
        Color { red: 0, green: 0, blue: 0 },
    ].iter() {
        // Switch this to use {} once you've added an implementation
        // for fmt::Display
        println!("{:?}", *color)
    }
}

여기서 [모든 형식화 trait 목록][fmt tratis]을 볼 수 있고 이들의 인자 타입들은 std::fmt 문서에 있다. You can view a full list of formatting traits and their argument types in the std::fmt documentation.

Activity

fmt::Display trait을 상기 Color 구조체에 대해 구현해 다음과 같은 출력을 보라: Add an implementation of the fmt::Display trait for the Color struct above so that the output displays as:

RGB (128, 255, 90) 0x80FF5A
RGB (0, 3, 254) 0x0003FE
RGB (0, 0, 0) 0x000000

막힐 때를 위한 두 힌트:

See also

std::fmt

results matching ""

    No results matching ""