rust 声明宏学习笔记
在写 rust
版的 hello,world
时想必你一定用到了 println!();
这个“函数”了吧,其实 println!()
就是一个声明宏
。
声明宏语法:
macro_rules ! 宏名字 宏规则1|宏规则2..
匹配器:
item
: 程序项block
: 块表达式stmt
: 语句pat
: 模式expr
: 表达式ty
: 类型ident
: 标识符或关键字path
: 类型表达式形式的路径tt
: token树meta
: 属性lifetime
: 生存期 tokenvis
: 可能为空的可见性限定符literal
: 匹配-
? 字面量表达式
重复符号
*
- 表示任意数量的重复+
- 表示至少有一个?
- 表示一个可选的匹配项
一个简单的声明宏
声明宏的调用需要在宏后面加上 !
符号,然后使用 ()
[]
{}
都可以,通常使用 ()
。
macro_rules! line {
() => {
println!("------------------------------------------------")
};
}
fn main() {
line!();
let box1 = geometry::Box::new(23.3, 56.3, 36.5);
println!("box1: width: {}, height: {}, length: {}", box1.width, box1.height, box1.length);
println!("The volume of box1 is: {:.3}", box1.get_volume());
line![];
}
带不定长参数的宏
macro_rules! line {
() => {
println!("------------------------------------------------")
};
($($line_style: expr)*) => {
println!("{}", $($line_style)*);
}
}
fn main() {
line!();
let box1 = geometry::Box::new(23.3, 56.3, 36.5);
println!(
"box1: width: {}, height: {}, length: {}",
box1.width, box1.height, box1.length
);
println!("The volume of box1 is: {:.3}", box1.get_volume());
line!("+++++++++++++++++++++++++++++++++++++++++++++++++++++++");
}
将宏放到单独的模块中
目录结构:
zsf@xiaotupo:~/code/rust_examples/helloworld$ tree .
.
├── Cargo.lock
├── Cargo.toml
└── src
├── geometry
│ ├── box.rs
│ ├── macros.rs
│ └── mod.rs
└── main.rs
2 directories, 6 files
main.rs
mod geometry;
fn main() {
line!();
let box1 = geometry::Box::new(23.3, 56.3, 36.5);
println!(
"box1: width: {}, height: {}, length: {}",
box1.width, box1.height, box1.length
);
println!("The volume of box1 is: {:.3}", box1.get_volume());
line!("++++++++++++++++++++++++++++++++++++++++++++++++");
}
mod.rs
mod r#box;
pub mod macros;
pub use r#box::Box;
macros.rs
#[macro_export] // 允许外部模块使用该宏
macro_rules! line {
() => {
println!("------------------------------------------------")
};
($($line_style: expr)*) => {
println!("{}", $($line_style)*);
}
}