Rust宏編寫


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"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM