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)