Rust 매크로 디자인자 소개

Beginner

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

소개

이 랩에서는 Rust 매크로에서 디자인자 (designator) 의 개념을 소개합니다. 디자인자는 매크로의 인수에 접두사로 사용되며, 타입 어노테이션 (type annotation) 이 적용됩니다. 디자인자의 예시로는 변수/함수 이름에 사용되는 ident, 표현식에 사용되는 expr, 코드 블록에 사용되는 block, 패턴에 사용되는 pat 등이 있습니다. 이러한 디자인자는 매크로 규칙 내에서 제공된 인수를 기반으로 코드를 생성하는 데 사용됩니다.

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

디자인자 (Designators)

매크로의 인수는 달러 기호 $로 시작하고, *디자인자 (designator)*로 타입 어노테이션 (type annotated) 됩니다.

macro_rules! create_function {
    // 이 매크로는 `ident` 디자인자의 인수를 받아
    // `$func_name` 이라는 이름의 함수를 생성합니다.
    // `ident` 디자인자는 변수/함수 이름에 사용됩니다.
    ($func_name:ident) => {
        fn $func_name() {
            // `stringify!` 매크로는 `ident` 를 문자열로 변환합니다.
            println!("You called {:?}()",
                     stringify!($func_name));
        }
    };
}

// 위 매크로를 사용하여 `foo` 와 `bar` 라는 이름의 함수를 생성합니다.
create_function!(foo);
create_function!(bar);

macro_rules! print_result {
    // 이 매크로는 `expr` 타입의 표현식을 받아
    // 결과와 함께 문자열로 출력합니다.
    // `expr` 디자인자는 표현식에 사용됩니다.
    ($expression:expr) => {
        // `stringify!` 는 표현식을 *있는 그대로* 문자열로 변환합니다.
        println!("{:?} = {:?}",
                 stringify!($expression),
                 $expression);
    };
}

fn main() {
    foo();
    bar();

    print_result!(1u32 + 1);

    // 블록도 표현식이라는 것을 기억하세요!
    print_result!({
        let x = 1u32;

        x * x + 2 * x - 1
    });
}

다음은 사용 가능한 디자인자 (designator) 중 일부입니다.

  • block
  • expr는 표현식에 사용됩니다.
  • ident는 변수/함수 이름에 사용됩니다.
  • item
  • literal은 리터럴 상수 (literal constants) 에 사용됩니다.
  • pat (패턴)
  • path
  • stmt (구문)
  • tt (토큰 트리)
  • ty (타입)
  • vis (가시성 한정자)

전체 목록은 [Rust Reference]를 참조하십시오.

요약

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