Rust 튜플 구조체에서 Derive 트레이트 사용하기

Beginner

This tutorial is from open-source community. Access the source code

소개

이 랩에서는 Rust 의 #[derive] 속성에 대해 배우게 됩니다. 이 속성은 컴파일러가 Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Hash, Default, 그리고 Debug와 같은 특정 트레이트에 대한 기본적인 구현을 제공하도록 합니다. 이러한 트레이트는 더 복잡한 동작이 필요할 경우 수동으로 구현할 수도 있습니다. 이 랩에서는 Centimeters, Inches, 그리고 Seconds와 같은 다양한 튜플 구조체에 이러한 트레이트를 사용하는 예제 코드를 제공합니다.

참고: 랩에서 파일 이름을 지정하지 않은 경우, 원하는 파일 이름을 사용할 수 있습니다. 예를 들어, main.rs를 사용하고 rustc main.rs && ./main으로 컴파일하고 실행할 수 있습니다.

Derive (파생)

컴파일러는 #[derive] 속성을 통해 일부 트레이트에 대한 기본적인 구현을 제공할 수 있습니다. 더 복잡한 동작이 필요한 경우 이러한 트레이트를 수동으로 구현할 수도 있습니다.

다음은 파생 가능한 트레이트 목록입니다.

  • 비교 트레이트: Eq, PartialEq, Ord, PartialOrd.
  • Clone, 복사를 통해 &T에서 T를 생성합니다.
  • Copy, '이동 의미론 (move semantics)' 대신 '복사 의미론 (copy semantics)'을 타입에 부여합니다.
  • Hash, &T에서 해시를 계산합니다.
  • Default, 데이터 타입의 빈 인스턴스를 생성합니다.
  • Debug, {:?} 포매터를 사용하여 값을 형식화합니다.
// `Centimeters`, 비교 가능한 튜플 구조체
#[derive(PartialEq, PartialOrd)]
struct Centimeters(f64);

// `Inches`, 출력 가능한 튜플 구조체
#[derive(Debug)]
struct Inches(i32);

impl Inches {
    fn to_centimeters(&self) -> Centimeters {
        let &Inches(inches) = self;

        Centimeters(inches as f64 * 2.54)
    }
}

// `Seconds`, 추가 속성이 없는 튜플 구조체
struct Seconds(i32);

fn main() {
    let _one_second = Seconds(1);

    // Error: `Seconds` 는 출력할 수 없습니다; `Debug` 트레이트를 구현하지 않았습니다.
    //println!("One second looks like: {:?}", _one_second);
    // TODO ^ Try uncommenting this line

    // Error: `Seconds` 는 비교할 수 없습니다; `PartialEq` 트레이트를 구현하지 않았습니다.
    //let _this_is_true = (_one_second == _one_second);
    // TODO ^ Try uncommenting this line

    let foot = Inches(12);

    println!("One foot equals {:?}", foot);

    let meter = Centimeters(100.0);

    let cmp =
        if foot.to_centimeters() < meter {
            "smaller"
        } else {
            "bigger"
        };

    println!("One foot is {} than one meter.", cmp);
}

요약

축하합니다! Derive 랩을 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 실력을 향상시킬 수 있습니다.