主頁 > 後端開發 > Rust中的宏:宣告宏和程序宏

Rust中的宏:宣告宏和程序宏

2023-04-23 07:33:56 後端開發

Rust中的宣告宏和程序宏

宏是Rust語言中的一個重要特性,它允許開發人員撰寫可重用的代碼,以便在編譯時擴展和生成新的代碼,宏可以幫助開發人員減少重復代碼,并提高代碼的可讀性和可維護性,Rust中有兩種型別的宏:宣告宏和程序宏,

宣告宏:

宣告宏是一種用于定義新的宏的語法,它使用macro_rules!關鍵字定義,并遵循特定的語法規則,宣告宏通常用于定義簡單的宏,例如計算兩個數字之和或列印一條訊息,

例如,下面是一個簡單的宣告宏,用于計算兩個數字之和:

macro_rules! add {
    ($x:expr, $y:expr) => {
        $x + $y
    };
}

fn main() {
    let x = 5;
    let y = 6;
    println!("{}", add!(x, y));
}
復制代碼

在上面的示例中,我們定義了一個名為add的宣告宏,該宏接受兩個引數:$x$y,并使用=>符號將引數映射到運算式$x + $y,在主函式中,我們使用add!(x, y)呼叫該宏,并將結果列印到控制臺,

程序宏:

程序宏是另一種用于定義新的宏的語法,與宣告宏不同,程序宏使用特殊的函式來定義,并可以接受任意數量的引數,程序宏通常用于定義更復雜、更強大的宏,例如實作自定義派生或生成新的型別,

例如,下面是一個簡單的程序宏,用于計算兩個數字之和:

use proc_macro::TokenStream;

#[proc_macro]
pub fn add(input: TokenStream) -> TokenStream {
    let mut iter = input.into_iter();
    let x = iter.next().unwrap();
    let _comma = iter.next().unwrap();
    let y = iter.next().unwrap();

    let result = format!("{} + {}", x, y);
    result.parse().unwrap()
}

fn main() {
    let x = 5;
    let y = 6;
    println!("{}", add!(x, y));
}
復制代碼

在上面的示例中,我們定義了一個名為add的程序宏,該函式使用#[proc_macro]屬性標記,并接受一個名為input的引數,該引數表示傳遞給該宏的TokenStream,在函式體內部,我們使用迭代器來訪問TokenStream中的每個元素,并使用format!宏將其格式化為字串,最后,我們將結果轉換為TokenStream并回傳,

宣告宏和程序宏的比較:

宣告宏和程序宏都可以用于定義新的宏,但它們之間存在一些差異,宣告宏更簡單、易于使用,但功能有限;而程序宏更強大、靈活,但需要更多的編碼技巧,

例如,在上面給出的示例中,我們可以看到宣告宏和程序宏都可以用于計算 兩個數字之和,但是,宣告宏只能接受固定數量的引數,并且必須遵循特定的語法規則,而程序宏則可以接受任意數量的引數,并且可以使用任意的Rust代碼來定義宏的行為,

此外,宣告宏和程序宏在實作方式上也有所不同,宣告宏是在編譯時擴展的,這意味著它們在編譯器內部被處理,而程序宏則是在編譯時呼叫的,這意味著它們在編譯器外部被處理,這種差異使得程序宏可以訪問更多的編譯器資訊,并且可以使用更復雜的演算法來生成新的代碼,

結論:

總之,Rust中的宏是一種強大的工具,可以幫助開發人員撰寫可重用、高效和靈活的代碼,無論是宣告寶還是程序寶,都值得開發人員學習和掌握,通過使用宏,開發人員可以減少重復代碼,并提高代碼的可讀性和可維護性,因此,如果您正在使用Rust語言進行軟體開發,那么了解宏是非常重要的,from劉金,轉載請注明原文鏈接,感謝!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/550858.html

標籤:其他

上一篇:影像金字塔

下一篇:返回列表

標籤雲
其他(157855) Python(38092) JavaScript(25381) Java(17985) C(15215) 區塊鏈(8256) C#(7972) AI(7469) 爪哇(7425) MySQL(7137) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4557) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2430) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1959) Web開發(1951) HtmlCss(1919) python-3.x(1918) 弹簧靴(1913) C++(1910) xml(1889) PostgreSQL(1872) .NETCore(1854) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的宏:宣告宏和程序宏

    Rust中的宣告宏和程序宏 宏是Rust語言中的一個重要特性,它允許開發人員撰寫可重用的代碼,以便在編譯時擴展和生成新的代碼。宏可以幫助開發人員減少重復代碼,并提高代碼的可讀性和可維護性。Rust中有兩種型別的宏:宣告宏和程序宏。 宣告宏: 宣告宏是一種用于定義新的宏的語法。它使用macro_rul ......

    uj5u.com 2023-04-23 07:33:56 more
  • 影像金字塔

    影像金字塔 簡單來說就是 自下而上影像一步一步縮小 1 高斯金字塔(涉及高斯分布) 向下采樣(縮小,對金字塔來說是自下向上) 第一步: 高斯濾波去噪 第二部:將偶數行和列去掉 向上采樣(放大,對金字塔來說是自上向下) 第一步:在每個方向上擴大兩倍,新增的行和列填充0 第二步:利用之前同樣的內核進行卷 ......

    uj5u.com 2023-04-23 07:33:50 more
  • 第8章 多執行緒

    8.1 執行緒簡介 1 、多任務 現實生活中多件事一起作。 在程式中是指在一個系統中可以同時進行多個行程,即有多個單獨運行的任務,每一個任務對應一個行程。 每一個行程都有一段專用的記憶體區域,即使是多次啟動同一段程式產生不同的行程也是如此。 2、多執行緒 Java 給多執行緒編程提供了內置的支持。 一條執行緒 ......

    uj5u.com 2023-04-23 07:33:46 more
  • 影像邊緣檢測(Canny)

    Canny檢測的流程 Canny檢測主要是用于邊緣檢測 1)使用高斯濾波器,以平滑影像,濾除噪聲。 2)計算影像中每個像素點的梯度強度和方向。 3)應用非極大值(Non-Maximum Suppression)抑制,以消除邊緣檢測帶來的雜散回應 4)應用雙閾值(Double-Threshold)檢測 ......

    uj5u.com 2023-04-23 07:33:41 more
  • 洛谷:P5716日份天數

    題目描述 輸入年份和月份,輸出這一年的這一月有多少天。需要考慮閏年。 輸入格式 輸入兩個正整數,分別表示年份 $y$ 和月數 $m$,以空格隔開。 輸出格式 輸出一行一個正整數,表示這個月有多少天。 樣例 #1 樣例輸入 #1 1926 8 樣例輸出 #1 31 樣例輸入 #2 2000 2 樣例輸 ......

    uj5u.com 2023-04-23 07:33:33 more
  • 【Visual Leak Detector】原始碼檔案概覽

    說明 使用 VLD 記憶體泄漏檢測工具輔助開發時整理的學習筆記。本篇對 VLD 原始碼包中的各檔案用途做個概述。同系列文章目錄可見 《記憶體泄漏檢測工具》目錄 1. 整體概覽 以 vld2.5.1 版本為例,下載原始碼 后,根目錄下一共 5 個檔案夾:.teamcity、lib、mfc_detect、set ......

    uj5u.com 2023-04-23 07:33:28 more
  • Java學習(1)

    一、Java的基礎語法 1.變數和資料型別 在Java中,變數是用來存盤資料的容器,可以存盤各種型別的資料。Java中的變數分為兩類:基本資料型別變數和參考資料型別變數。 (1)基本資料型別(Primitive Data Types) 整數型別:byte、short、int、long 浮點型別:fl ......

    uj5u.com 2023-04-23 07:33:23 more
  • python| 關于excel的檔案處理

    創建一個成績單檔案score.xlsx,將平時成績單.xlsx檔案中對應班級作業表中學號和姓名列的內容寫入到score.xlsx中,并添加成績列,每個學生的成績采用隨機生成的一個分數填寫進去,最后統計所有學生的平均成績計算出來后,寫入到score.xlsx的最后一行最后一列之后的單元格中去。預想的步 ......

    uj5u.com 2023-04-23 07:33:18 more
  • Django筆記二十八之資料庫查詢優化匯總

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十八之資料庫查詢優化匯總 這一篇筆記將從以下幾個方面來介紹 Django 在查詢程序中的一些優化操作,有一些是介紹如何獲取 Django 查詢轉化的 sql 陳述句,有一些是理解 QuerySet 是如何獲取資料的。 以下是本篇筆記目錄: ......

    uj5u.com 2023-04-23 07:33:12 more
  • 多執行緒(一)

    #一:什么是多執行緒 執行緒是作業系統能夠進行運算調度的最小單位;它被包含在行程之中,是行程中的實際運作單位。 多執行緒,是指從軟體或者硬體上實作多個執行緒并發執行的技術。具有多執行緒能力的計算機因有硬體支持而能夠在同一時間執行多于一個執行緒,進而提升整體處理性能。 簡單來說:執行緒是程式中一個單一的順序控制流程 ......

    uj5u.com 2023-04-23 07:33:06 more