Derive 속성
Derive 속성 (#[derive])
구조체나 열거형을 만들 때 PartialEq나 Clone 같은 걸 매번 손으로 구현하면 정말 번거로워요. 그럴 때 #[derive(...)]를 써서 트레이트 구현을 자동으로 생성할 수 있어요. derive 속성은 하나 이상의 derive 매크로를 호출해서 데이터 구조를 위한 새 항목(item)을 자동 생성해 주는 속성이에요.
본문
PartialEq derive 매크로는 Foo<T> where T: PartialEq에 대한 PartialEq 구현을 생성해요. Clone derive 매크로도 Clone 구현을 마찬가지로 만들어 주고요.
#[derive(PartialEq, Clone)]
struct Foo<T> {
a: i32,
b: T,
}
위에서 생성된 impl 항목은 다음과 같은 형태로 펼쳐져요.
struct Foo<T> { a: i32, b: T }
impl<T: PartialEq> PartialEq for Foo<T> {
fn eq(&self, other: &Foo<T>) -> bool {
self.a == other.a && self.b == other.b
}
}
impl<T: Clone> Clone for Foo<T> {
fn clone(&self) -> Self {
Foo { a: self.a.clone(), b: self.b.clone() }
}
}
구문
derive 속성은 호출할 derive 매크로들의 경로 목록을 지정하기 위해 MetaListPaths 구문을 사용해요.
허용 위치
derive 속성은 구조체(struct), 열거형(enum), 공용체(union)에만 적용할 수 있어요.
반복 사용
derive 속성은 한 항목에 몇 번이든 사용할 수 있어요. 모든 속성에 나열된 derive 매크로가 전부 호출돼요.
표준 라이브러리에서의 노출
derive 속성은 표준 라이브러리에 다음과 같이 export되어 있어요.
core::derivestd::derivecore::prelude::v1::derivestd::prelude::v1::derive
내장 derive 매크로
내장(built-in) derive들은 언어 프렐류드에 정의되어 있어요. 내장 derive 목록은 다음과 같아요.
Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd
내장 derive는 생성하는 구현에 automatically_derived 속성을 포함시켜요.
동작 방식
매크로 확장(macro expansion) 중에, derive 목록의 각 요소에 대해 해당 derive 매크로는 0개 이상의 항목으로 확장돼요.
automatically_derived 속성
automatically_derived 속성은 "이 구현이 derive 매크로에 의해 자동으로 만들어졌다"는 사실을 표시하기 위해 구현을 주석으로 꾸미는 데 사용해요. 직접적인 효과는 없지만, 도구나 진단 린트가 이런 자동 생성 구현을 감지하는 데 쓰일 수 있어요.
struct Example에 #[derive(Clone)]를 주면 derive 매크로는 이런 결과물을 만들 수 있어요.
struct Example;
#[automatically_derived]
impl ::core::clone::Clone for Example {
#[inline]
fn clone(&self) -> Self {
Example
}
}
- 구문:
automatically_derived속성은 MetaWord 구문을 사용해요. - 허용 위치: 구현(impl)에만 적용할 수 있어요.
rustc는 다른 위치에서의 사용을 무시하지만 린트로 경고해요. 이건 미래에 에러가 될 수 있어요. - 반복 사용: 한 구현에
automatically_derived를 두 번 이상 쓰는 건 한 번 쓰는 것과 같은 효과예요.rustc는 첫 번째 이후의 사용에 대해 린트로 경고해요. - 동작:
automatically_derived속성은 동작이 없어요.