Derive 속성

Derive 속성 (#[derive])

구조체나 열거형을 만들 때 PartialEqClone 같은 걸 매번 손으로 구현하면 정말 번거로워요. 그럴 때 #[derive(...)]를 써서 트레이트 구현을 자동으로 생성할 수 있어요. derive 속성은 하나 이상의 derive 매크로를 호출해서 데이터 구조를 위한 새 항목(item)을 자동 생성해 주는 속성이에요.

출처: Rust Reference - Derive

본문

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::derive
  • std::derive
  • core::prelude::v1::derive
  • std::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 속성은 동작이 없어요.

더 알아보기 (Learn more)