欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2024年03月31日 10:12:05   作者:微小冷  
本文主要介紹了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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Rust你不認識的所有權

    Rust你不認識的所有權

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

    Rust中的derive屬性示例詳解

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

    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包的問題

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

    解析rust中的struct

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

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

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

    詳解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-09
  • 詳解thiserror庫在Rust中的使用

    詳解thiserror庫在Rust中的使用

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

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

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

    Rust中的內部可變性與RefCell<T>詳解

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

最新評論