Default
로 구조체, 열거형 타입 등에서 기본 값을 가져올 수 있습니다:
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
는 ..
을 사용하여, 구현하지 않은 필드를 기본 값으로 채워줄 수 있습니다:
Foo { x: 1, ..Foo::default() };
Foo { x: 1, ..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
매크로를 좀 건들면 해결될 문제라 생각합니다.