宏
Rust提供了一個強大的宏, 可進行元編程.看起來和函數很像, 只不過名稱末尾有一個!
一句換概括: 用代碼生成代碼, 控制代碼, 擴展代碼
寫一個最簡單的宏 后邊加!號的都是宏
// main.rs
#[macro_use]
mod mymacro;
// macro_test 宏
fn macro_test() {
echo_me!()
// 結果 kuqi
}
// mymacro.rs
// 定義宏
macro_rules! echo_me {
() => {
println!("kuqi")
};
}
可以傳入參數的宏 ( expr ->表達式)
// mymacro.rs
// 定義宏
macro_rules! echo_me {
() => {
println!("kuqi")
};
($exp: expr) => {
println!("{:?}", $exp);
}
}
宏添加可變參數 (就是**args , kwargs ) Rust的函數中不支持 宏中支持
// mymacros.rs
// 定義宏
macro_rules! echo_me {
// () => {
// println!("kuqi")
// };
//
// ($exp: expr) => {
// println!("{:?}", $exp);
// };
// + 至少一個 // * 0到所有 有點像正則
($($exp: expr), +) => {
$(
println!("{:?}", $exp);
)+
};
}
// main.rs
echo_me!("123", "agag", "faga");
// "123"
// "123"
// "agag"
- **元編程 - 利用宏創建自定義的函數 ** (有點像python中的type 動態的創建類)
ident 指示符 常用於函數名或變量名
// mymacros.rs
macro_rules! diy_func {
($fn_name: ident) => {
fn $fn_name () {
println!("my fn name is : {:?}", stringify!($fn_name));
}
};
}
// golang 就是傳入的函數名 無需定義
diy_func!(golang);
golang();
// 結果 my fn name is : "golang"