亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Rust用宏實(shí)現(xiàn)參數(shù)可變的函數(shù)的實(shí)現(xiàn)示例

 更新時間:2024年03月31日 10:12:05   作者:微小冷  
本文主要介紹了Rust用宏實(shí)現(xiàn)參數(shù)可變的函數(shù)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

聲明式宏

Rust中宏的概念與C/C++中相類似,是編譯期間執(zhí)行的一系列指令。但和C語言相比,Rust中的宏,有著更加復(fù)雜的替換,下面是一個示例

macro_rules! sqr {
    ($x:expr) => {$x * $x}
}

fn main() {
    println!("{}", sqr!(1 + 1));
}
// 運(yùn)行結(jié)果為4

其中,$x的類型是expr,即表達(dá)式。sqr的具體操作,就是把表達(dá)式$x替換為$x * $x。

僅從上面的示例來看,宏似乎同函數(shù)沒什么區(qū)別,或許優(yōu)勢僅體現(xiàn)在編譯期做替換,從而在編譯后可以減少一個函數(shù)指針的開銷。

所以,接下來,不妨用宏實(shí)現(xiàn)一個函數(shù)無法實(shí)現(xiàn)的功能:輸入多個參數(shù)。

參數(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));
}

編譯運(yùn)行的結(jié)果為10,接下來就細(xì)致地探討一下這個宏的替換規(guī)則。

首先,輸入是

( $( $x:expr ),* )

這里星號起到一個重復(fù)匹配的作用,表示左側(cè)的表達(dá)式可以重復(fù)匹配多次。而左側(cè)的表達(dá)式又被分成兩部分,最內(nèi)層的$緊跟著的x是一個表達(dá)式,這個表達(dá)式?jīng)]有任何要求。而這個x與后面的逗號與前面的$符號則形成了外層的匹配模式。

結(jié)合我們的輸入

sum!(1,2,3,4)

摘掉調(diào)用宏時用到的sum!(),其真正被替換的值便是1,2,3,4,而與宏定義中表達(dá)式相匹配的,則可理解為依次是

1 , 2 , 3 , 4 \begin{matrix} 1,\\2,\\3,\\4 \end{matrix} 1,2,3,4?

從而宏的替換內(nèi)容,可以被拆解為

let mut n = 0;
n += 1;
n += 2;
n += 3;
n += 4;
return n

于是,求和的功能就通過宏的方式實(shí)現(xiàn)了。

到此這篇關(guān)于Rust用宏實(shí)現(xiàn)參數(shù)可變的函數(shù)的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Rust 參數(shù)可變函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Rust你不認(rèn)識的所有權(quán)

    Rust你不認(rèn)識的所有權(quán)

    所有權(quán)對大多數(shù)開發(fā)者而言是一個新穎的概念,它是 Rust 語言為高效使用內(nèi)存而設(shè)計(jì)的語法機(jī)制。所有權(quán)概念是為了讓 Rust 在編譯階段更有效地分析內(nèi)存資源的有用性以實(shí)現(xiàn)內(nèi)存管理而誕生的概念
    2023-01-01
  • Rust中的derive屬性示例詳解

    Rust中的derive屬性示例詳解

    derive屬性的出現(xiàn)解決了手動實(shí)現(xiàn)一些特性時需要編寫大量重復(fù)代碼的問題,它可以讓編譯器自動生成這些特性的基本實(shí)現(xiàn),從而減少了程序員需要編寫的代碼量,這篇文章主要介紹了Rust中的derive屬性詳解,需要的朋友可以參考下
    2023-04-04
  • C和Java沒那么香了,Serverless時代Rust即將稱王?

    C和Java沒那么香了,Serverless時代Rust即將稱王?

    Serverless Computing,即”無服務(wù)器計(jì)算”,其實(shí)這一概念在剛剛提出的時候并沒有獲得太多的關(guān)注,直到2014年AWS Lambda這一里程碑式的產(chǎn)品出現(xiàn)。Serverless算是正式走進(jìn)了云計(jì)算的舞臺
    2021-06-06
  • 關(guān)于使用rust調(diào)用c++靜態(tài)庫并編譯nodejs包的問題

    關(guān)于使用rust調(diào)用c++靜態(tài)庫并編譯nodejs包的問題

    這篇文章主要介紹了使用rust調(diào)用c++靜態(tài)庫并編譯nodejs包的問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • 解析rust中的struct

    解析rust中的struct

    自定義的數(shù)據(jù)類型,為相關(guān)聯(lián)的值命名,打包成有意義的組合,類似python的dict,但是賦值的時候可以不按順序,本文給大家介紹下rust中的struct知識,感興趣的朋友一起看看吧
    2022-10-10
  • 詳解Rust 生命周期符號使用的方法和規(guī)律

    詳解Rust 生命周期符號使用的方法和規(guī)律

    生命周期是 Rust 中處理引用和所有權(quán)的關(guān)鍵概念,通過正確使用生命周期符號和遵循相關(guān)規(guī)律,你可以編寫出安全、高效的 Rust 代碼,這篇文章主要介紹了Rust 生命周期符號使用的方法和規(guī)律,需要的朋友可以參考下
    2024-03-03
  • 詳解Rust中三種循環(huán)(loop,while,for)的使用

    詳解Rust中三種循環(huán)(loop,while,for)的使用

    我們常常需要重復(fù)執(zhí)行同一段代碼,針對這種場景,Rust?提供了多種循環(huán)(loop)工具。一個循環(huán)會執(zhí)行循環(huán)體中的代碼直到結(jié)尾,并緊接著回到開頭繼續(xù)執(zhí)行。而?Rust?提供了?3?種循環(huán):loop、while?和?for,下面逐一講解
    2022-09-09
  • 詳解thiserror庫在Rust中的使用

    詳解thiserror庫在Rust中的使用

    在編程中,錯誤處理是一個至關(guān)重要的部分,在Rust中,我們經(jīng)常使用Result和Option類型來進(jìn)行錯誤處理,但有時,我們需要創(chuàng)建自定義的錯誤類型,這就是thiserror庫發(fā)揮作用的地方,可以極大的簡化代碼,所以本文就給大家介紹一下如何使用thiserror
    2023-08-08
  • vscode搭建rust開發(fā)環(huán)境的圖文教程

    vscode搭建rust開發(fā)環(huán)境的圖文教程

    Rust 是一種系統(tǒng)編程語言,它專注于內(nèi)存安全、并發(fā)和性能,本文主要介紹了vscode搭建rust開發(fā)環(huán)境的圖文教程,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Rust中的內(nèi)部可變性與RefCell<T>詳解

    Rust中的內(nèi)部可變性與RefCell<T>詳解

    內(nèi)部可變性允許在不可變引用中修改內(nèi)部數(shù)據(jù),通過RefCell在運(yùn)行時檢查借用規(guī)則,適用于Mock對象和多所有權(quán)的可變性場景,結(jié)合Rc和RefCell實(shí)現(xiàn)多所有者共享并修改數(shù)據(jù),但僅適用于單線程
    2025-02-02

最新評論