macro_rules! say_hello {
($name: expr) => {
println!("hello {}", $name);
};
}
fn main() {
say_hello!("Rust");
}
macro_rules! 키워드로 정의한다$ 기호는 매크로 인자를 나타낸다macro_rules! add {
($a: expr, $b: expr) => {
$a + $b
};
}
fn main() {
println!("{}", add!(1, 2));
}
($matcher) => {$expansion}
($matcher) => ($expansion)
[$matcher] => {$expansion}
{$matcher} => {$expansion}
$name: designator
| designator | 내용 |
|---|---|
| expr | 표현식 |
| ident | 식별자 |
| tt | 토큰 트리 |
| ty | 타입 |
| pat | 패턴 |
macro_rules! create_function {
($func_name: ident) => {
fn $func_name() {
println!{"function: {:?}()", stringify!($func_name)}
}
};
}
create_function!(ident_func);
fn main() {
ident_func();
}
macro_rules! create_accessors {
($name: ident, $type: ty, $setter:ident) => {
fn $name(&self) -> &$type {
&self.$name
}
fn $setter(&mut self, value: $type) {
self.$name = value;
}
};
}
#[derive(Debug)]
struct Person {
name: String,
age: i32
}
impl Person {
create_accessors!(name, String, set_name);
create_accessors!(age, i32, set_age);
}
fn main() {
let mut person = Person {name: String::from("name"), age: 33};
person.set_name(String::from("newname"));
person.set_age(22);
println!("{:?}", person);
}
macro_rules! declare_with_values {
($( $var:ident = $val:expr ),*) => {
$(let mut $var = $val;)*
};
}
fn main() {
declare_with_values!(a = 3, b = 7, c = 12);
println!("{} {} {}", a, b, c);
}
$(...) sep * rep의 형태로 정의할 수 있다$(...)은 $( $var:ident = $val:expr ),sep은 ,rep은 * 이다| 지시자 | 내용 |
|---|---|
| $(...) | 일치시킬 패턴과 designator를 포함 |
| sep | 각 반복 사이의 구분자 ,(쉼표), :(세미콜론), +(더하기)와 같은 토큰이 들어갈 수 있다 |
| rep | 반복의 종류 *(별표)는 0회 이상의 반복, +(더하기)는 1회 이상의 반복을 의미한다 |
macro_rules! multi_var {
($($var:ident: $type:ty), *) => {
$(
let mut $var: $type = Default::default();
)*
};
}
fn main() {
multi_var!(x: i32, y: f64, z: String);
// let mut x: i32 = Default::default();
// let mut y: f64 = Default::default();
// let mut z: String = Default::default();
}