15.1 Designators

매크로의 인자는 접두사로 달라 표시 $가 들어가고 지정자(designator)로 타입 주해된다.

macro_rules! create_function {
    // 이 매크로는 지정자`ident`의 인수를 취하고 
    // `$func_name`으로 이름지어진 함수를 생성한다.
    // `ident`지정자는 변수/함수 이름으로 사용된다.
    ($func_name:ident) => (
        fn $func_name() {
            // `stringify!`매크로가 `ident`를 string으로 변환한다.
            println!("You called {:?}()",
                     stringify!($func_name))
        }
    )
}

// 상기 매크로를 통해 `foo`와 `bar`로 이름지어진 함수들을 생성한다.
create_function!(foo);
create_function!(bar);

macro_rules! print_result {
    // 이 매크로는 `expr`타입의 표현식을 취해 결과와 함께 문자열로 출력한다.
    // `expr`지정자가 표현식에 사용된다.
    ($expression:expr) => (
        // `stringify!`는 표현식을 *있는 그대로* string으로 변환한다.
        println!("{:?} = {:?}",
                 stringify!($expression),
                 $expression)
    )
}

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

    print_result!(1u32 + 1);

    // 표현식이기도 한 블럭을 통해 다시 호출!
    print_result!({
        let x = 1u32;

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

다음 항목들은 모든 지정자들이다:

  • block
  • expr 은 표현식을 위해 사용된다.
  • ident 은 변수/함수 이름을 위해 사용된다.
  • item
  • pat (pattern)
  • path
  • stmt (statement)
  • tt (token tree)
  • ty (type)

results matching ""

    No results matching ""