Default 트레잇

Default로 구조체, 열거형 타입 등에서 기본 값을 가져올 수 있습니다:

#![allow(unused)]
fn main() {
let (a, b, c, d): (usize, bool, String, Vec<i32>) = Default::default();

assert_eq!(a, 0);
assert_eq!(b, false);
assert_eq!(c, "");
assert_eq!(d, vec![]);
}

Default 트레잇을 구현하면 됩니다:

#[derive(Debug)]
struct Foo {
    x: i32,
    y: i32,
}

impl Default for Foo {
    fn default() -> Self {
        Foo { x: 0, y: 0 }
    }
}

fn main() {
    let foo = Foo::default();
    let foo: Foo = Default::default();

    assert_eq!(foo.x, 0);
    assert_eq!(foo.y, 0);
}

이렇게 구현된 Default..을 사용하여, 구현하지 않은 필드를 기본 값으로 채워줄 수 있습니다:

#![allow(unused)]
fn main() {
Foo { x: 1, ..Foo::default() };
Foo { x: 1, ..Default::default() };
}

<Default를 구현한 타입>::default(), Default::default() 모두 같은 역할입니다. 단, Default::default()의 경우엔 위 코드처럼 타입 어노테이션을 붙여줘 하는 경우도 있습니다.

열거형에서 Default

열거형(enum)의 경우엔 Default 트레잇 구현 없이 #[default] 속성(attributes)을 사용해 기본 값을 지정할 수 있습니다:

#[derive(Default, Debug)]
enum Foo {
    A,
    #[default]
    B,
}

fn main() {
    println!("{:?}", Foo::default());
}

단, 빈 아이템만 가능합니다. B(String) 같은 건 안된다는 소리죠. (내부적으로 Default 트레잇을 구현하기 때문에 불가능)

열거형의 아이템이 일급객체가 아니여서, 빈 아이템이 아니라면 Default를 적용하지 못한다고는 하지만, 개인적인 생각이긴하나 Default 매크로를 좀 건들면 해결될 문제라 생각합니다.