Default 트레잇
포스트
취소

Default 트레잇

개요

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

1
2
3
4
5
6
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 트레잇을 구현하면 됩니다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#[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..을 사용하여, 구현하지 않은 필드를 기본 값으로 채워줄 수 있습니다:

1
2
Foo { x: 1, ..Foo::default() };
Foo { x: 1, ..Default::default() };

<Default를 구현한 타입>::default(), Default::default() 모두 같은 역할입니다.
타입 추론이 불가능한 경우, Default::default()의 경우엔 위 코드처럼 타입 어노테이션을 붙여줘야합니다.

열거형에서의 Default

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

1
2
3
4
5
6
7
8
9
10
#[derive(Default, Debug)]
enum Foo {
    A,
    #[default]
    B,
}

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

단, #[default] 속성은 빈 아이템만 취급합니다.