study_example/advance_feature/
macros.rs

1#[macro_export] // 指示每当定义该宏的包进入作用域时该宏就可以用,没有这个宏就无法进入作用域
2macro_rules! vecs {
3    /* $x:expr 匹配任何rust表达式并为表达式指定名称$x  `*`表示该模式与*之前的任何内容匹配0个或者多个 */
4    ( $( $x:expr ),* ) => { // 模式的arm,待匹配, $()后面的逗号表示文字逗号可以选择出现与$()匹配的代码之后
5        {
6            let mut temp_vec = Vec::new();
7            $(
8                temp_vec.push($x);
9                )*
10            temp_vec
11        }
12    };
13}
14
15/*use proc_macro;
16#[some_attribute]
17pub fn some_name(input:TokenStream) -> TokenStream{}*/
18pub trait HelloMacro {
19    fn hello_macro();
20}
21
22struct Pancakes;
23
24impl HelloMacro for Pancakes {
25    fn hello_macro() {
26        println!("Hello macro! My name is Pancakes.");
27    }
28}
29
30use hello_macro_derive::*;
31// 修改为外部crate以使得能publish
32//#[derive(HelloMacro2)]
33#[derive(HelloMacro)]
34struct Pancakes2;
35
36/// 运行结果如下
37/// ```txt
38/// [12, 34, 56, 98]
39/// Hello macro! My name is Pancakes.
40/// Hello, Macro! My name is Pancakes2!
41/// ```
42pub fn macros_study() {
43    let vec_val = vecs![12, 34, 56, 98];
44    println!("{:?}", vec_val);
45    Pancakes::hello_macro();
46    Pancakes2::hello_macro();
47}