Rust用宏實現(xiàn)參數(shù)可變的函數(shù)的實現(xiàn)示例
聲明式宏
Rust中宏的概念與C/C++中相類似,是編譯期間執(zhí)行的一系列指令。但和C語言相比,Rust中的宏,有著更加復雜的替換,下面是一個示例
macro_rules! sqr { ($x:expr) => {$x * $x} } fn main() { println!("{}", sqr!(1 + 1)); } // 運行結果為4
其中,$x
的類型是expr,即表達式。sqr的具體操作,就是把表達式$x
替換為$x * $x
。
僅從上面的示例來看,宏似乎同函數(shù)沒什么區(qū)別,或許優(yōu)勢僅體現(xiàn)在編譯期做替換,從而在編譯后可以減少一個函數(shù)指針的開銷。
所以,接下來,不妨用宏實現(xiàn)一個函數(shù)無法實現(xiàn)的功能:輸入多個參數(shù)。
參數(shù)可變的求和函數(shù)
下面用宏實現(xiàn)一個輸入?yún)?shù)可變的函數(shù)sum,功能是求和。
macro_rules! sum { ( $( $x:expr ),* ) => { { let mut n = 0; $(n += $x;)* n } }; } fn main(){ println!("{}", sum!(1,2,3,4)); }
編譯運行的結果為10,接下來就細致地探討一下這個宏的替換規(guī)則。
首先,輸入是
( $( $x:expr ),* )
這里星號起到一個重復匹配的作用,表示左側的表達式可以重復匹配多次。而左側的表達式又被分成兩部分,最內層的$
緊跟著的x是一個表達式,這個表達式?jīng)]有任何要求。而這個x與后面的逗號與前面的$
符號則形成了外層的匹配模式。
結合我們的輸入
sum!(1,2,3,4)
摘掉調用宏時用到的sum!()
,其真正被替換的值便是1,2,3,4
,而與宏定義中表達式相匹配的,則可理解為依次是
1 , 2 , 3 , 4 \begin{matrix} 1,\\2,\\3,\\4 \end{matrix} 1,2,3,4?
從而宏的替換內容,可以被拆解為
let mut n = 0; n += 1; n += 2; n += 3; n += 4; return n
于是,求和的功能就通過宏的方式實現(xiàn)了。
到此這篇關于Rust用宏實現(xiàn)參數(shù)可變的函數(shù)的實現(xiàn)示例的文章就介紹到這了,更多相關Rust 參數(shù)可變函數(shù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C和Java沒那么香了,Serverless時代Rust即將稱王?
Serverless Computing,即”無服務器計算”,其實這一概念在剛剛提出的時候并沒有獲得太多的關注,直到2014年AWS Lambda這一里程碑式的產(chǎn)品出現(xiàn)。Serverless算是正式走進了云計算的舞臺2021-06-06關于使用rust調用c++靜態(tài)庫并編譯nodejs包的問題
這篇文章主要介紹了使用rust調用c++靜態(tài)庫并編譯nodejs包的問題,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08詳解Rust中三種循環(huán)(loop,while,for)的使用
我們常常需要重復執(zhí)行同一段代碼,針對這種場景,Rust?提供了多種循環(huán)(loop)工具。一個循環(huán)會執(zhí)行循環(huán)體中的代碼直到結尾,并緊接著回到開頭繼續(xù)執(zhí)行。而?Rust?提供了?3?種循環(huán):loop、while?和?for,下面逐一講解2022-09-09vscode搭建rust開發(fā)環(huán)境的圖文教程
Rust 是一種系統(tǒng)編程語言,它專注于內存安全、并發(fā)和性能,本文主要介紹了vscode搭建rust開發(fā)環(huán)境的圖文教程,具有一定的參考價值,感興趣的可以了解一下2024-03-03