max std value 宏_Rust Macro/宏 新手指南

Rust語言最強大的一個特點就是可以創建和利用宏/Macro。不過創建 Rust宏看起來挺復雜,常常令剛接觸Rust的開發者心生畏懼。這片文章 的目的就是幫助你理解Rust Macro的基本運作原理,學習如何創建自己的 Rust宏。

相關鏈接:在線學編程 - 匯智網

1、什么是Rust的宏/Macro?

b71689a2d35ff5e5d77d456eb02d3252.png

如果你嘗試過Rust,應該已經用過Rust的宏了:println!。這個宏 可以在終端輸出一行文本,并且支持變量的插值。

簡單地說,Rust宏讓你可以發明自己的語法,編寫出可以自行展開的代碼, 也就是我們通常所說的元編程,你甚至可以用Rust宏來創作自己的DSL。

Rust宏的基本運作機制就是:首先匹配宏規則中定義的模式,然后將匹配 結果綁定到變量,最后展開變量替換后的代碼。

不理解也沒有關系,讓我們繼續看。

2、如果創建Rust宏/Macro?

可以使用Rust預置的macro_rules!宏來創建一個新的Rust宏。

下圖展示了如何創建一個空白的Rust宏:hey!,這個宏什么功能 也沒有,我們現在只關注它的結構:

016100e2f96eaf725f53b3098fd125f5.png

() => {}看起來很神秘,因為它不是標準的rust語法,是macro_rules! 這個宏自己發明的,用來表示一條宏規則,=>左邊是匹配模式,右邊是 等待展開的代碼:

7f1631d060eee0b589a141df3a74d9bc.png

左邊的小括號部分是Rust宏的匹配器/Matcher,用來匹配模式并捕捉變量,這是我們 發明自定義語法和DSL的關鍵所在。

右邊的大括號部分是Rust宏的轉碼器/Transcriber,也就是我們要應用匹配器捕捉到 的變量的部分,Rust編譯器將利用變量和這部分的代碼來生成實際的Rust代碼。

類似于Rust中的match語句,在macro_rules!中可以定義多條宏規則,例如:

macro_rules! hey{      () => {},     () => {}}

3、模式匹配與變量捕捉

現在我們看看Rust宏的模式是如何匹配的。

fea9dc9ebabb528fb0dfe05ba29ff9d4.png

在匹配器/Matcher中,$name部分定義了變量名,匹配結果將綁定到該變量以便 應用到轉碼器/Transcriber中。在這個示例中,表示我們將Rust宏的匹配結果存入變量$name。

冒號后面的部分被稱為選擇器/Designator,用于聲明我們要匹配的類型。 例如在這個示例中,我們使用的是表達式選擇器,也就是expr, 這告訴Rust:匹配一個表達式,然后存入$name變量。

表達式選擇器只是Rust中眾多可用選擇器中的一個,下面是一些常見的 Rust宏選擇器:

  • item:條目,例如函數、結構、模塊等
  • block:代碼塊
  • stmt:語句
  • pat:模式
  • expr:表達式
  • ty:類型
  • ident:標識符
  • path:路徑,例如 foo、 ::std::mem::replace, transmute::<_ int>, …
  • meta:元信息條目,例如 #[…]和 #![rust macro…] 屬性
  • tt:詞條樹

那么,現在如何在轉碼器/Transcriber中應用我們捕捉到的變量?

6c30b6a0ca8a01218d24ac095b77b9b8.png

很簡單,在Rust宏轉碼器部分我們只需要在常規的Rust代碼中,嵌入匹配器 捕捉到的變量就行了,沒什么特別之處!

4、編寫第一個Rust宏

我們已經了解了如何編寫一個Rust宏,現在讓我們動手寫一個:

7bf54cb7ad62379073c18c561546f6e3.png

很簡單,對吧?

5、重復模式的提取與利用

我們用的許多Rust宏都可以支持非常多的輸入。以vec!宏為例,我們 可以這樣調用它:vec![rust macro1,2,3,4,5],或者這樣:vec![rust macro1,2,3,,4,5,6,7,8]。

那么vec!宏是如何實現這一點的?很顯然它不會去定義成千上萬個變量來 逐個保存匹配結果,秘密在于重復模式的匹配:

12379f2cc23963e96edb73deb37496bb.png

我們只需要把希望重復的模式寫在$(...)這部分,然后插入分隔符, 在這里也就是逗號,最后添加一個*符號,表示重復匹配$()中的模式。

還有點暈?讓我們看個具體的例子:

a2b32574dda9a9f25d991dc9436ca17e.png

在這個示例中,對于hey!宏,我們重復捕捉輸入表達式并存入變量$name, 也就是說,所有捕捉到的表達式都綁定到變量$name了 —— 不妨把 $name 想象成數組變量。

6、用重復模式在Rust中實現Ruby的哈希表語法

如果你之前寫過Ruby程序,可能還記得在Ruby中定義哈希表的語法:key => value。 現在我們可以用Rust宏來在Rust中實現哈希表的這種定義方法!

22b4884ddd544f9a1f3b8f51efc4b528.png

在Rust宏的匹配器部分,我們使用模式$key:expr => $value:expr 來分別捕捉$key和$value表達式,分隔符為=>。 不過現在只能匹配一個鍵/值對,但是哈希表通常都是多個鍵值對的。應該 如何實現?

答案是使用重復匹配:

12e61d15e4fab0f2c1824bcb1f4455bd.png

將我們要匹配的鍵/值對模式放到$(),*,就可以進行重復匹配了。COOL!!

a7f71aab5faf00099054e5b5ac6a933a.png

那么,如何應用捕捉到的鍵/值對?顯然,我們應該在Rust宏的轉碼器中創建哈希表對象, 然后將捕捉到的所有鍵值對插入該哈希表:

a63a12485f5a5dee461703fb16484e3b.png

在轉碼器中,注意代碼中的$()*,它的意思是其中的代碼會重復展開!

15ab3cea62cee5c63b48cd33ebaad10d.png

就像你看到的,當我們調用map!("name" => "Finn", "gender" => "Boy")時, 我們在生成兩段重復的代碼。

key => value將被轉碼為在Rust宏的轉碼器/transcriber中指定的代碼,也就是 hm.insert($key, $value),其中$key和$value是我們在Rust宏的匹配器部分 捕捉到的變量。

好了,讓我們看看完整的map!宏實現:

11adaf63f6707a4d6fd33a5807632cb0.png

只用了幾行代碼,我們就創建了一個功能完整的Rust宏!現在讓 我們寫個小程序測試一下:

8830ca04a1b8d27cc1e48c6c4004c2ac.png

COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL.


原文鏈接:http://blog.hubwiz.com/2020/01/30/rust-macro/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532429.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532429.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532429.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

高斯分布及其極大似然估計

高斯分布及其極大似然估計 高斯分布 一維高斯分布 一維高斯分布的概率密度函數為&#xff1a; N(μ,σ2)12πσexp?(?(x?μ)22σ2)N(\mu,\sigma^2)\frac{1}{\sqrt{2\pi}\sigma}\exp(-\frac{(x-\mu)^2}{2\sigma^2}) N(μ,σ2)2π?σ1?exp(?2σ2(x?μ)2?) 多維高斯分布…

農林資金 大數據審計案例_大數據審計:現狀與發展

大數據審計&#xff1a;現狀與發展【摘要】傳統手工環境下&#xff0c;審計人員常用的審計方法包括檢查法、觀察法、重新計算法、外部調查法、分析法、鑒定法等。隨著信息技術的發展&#xff0c;被審計單位的運行越來越依賴于信息化環境。信息化環境下審計工作發生了巨大的變化…

商標45類分類表明細表_2019版注冊商標分類表,商標注冊45類范圍明細

注冊商標的時候都是要確定具體的產品或服務的&#xff0c;目前我國商標分類是用《類似商品和服務區分表–基于尼斯分類第十一版》2019年版這本分類書。這本分類表也是全球通用的分類表&#xff0c;商標分類總共有45個類別&#xff0c;1-34類是產品類、35-45類是服務類。這45個大…

高維高斯分布基礎

高維高斯分布基礎 多位高斯分布的幾何理解 多維高斯分布表達式為&#xff1a; p(x∣μ,Σ)1(2π)p/2∣Σ∣1/2e?12(x?μ)TΣ?1(x?μ)p(x|\mu,\Sigma)\frac{1}{(2\pi)^{p/2}|\Sigma|^{1/2}}e^{-\frac{1}{2}(x-\mu)^{T}\Sigma^{-1}(x-\mu)} p(x∣μ,Σ)(2π)p/2∣Σ∣1/21?…

angularjs sill 創建項目_開源項目——博客項目MyBlogs.Core,基于.NET 5

個人博客站項目源碼&#xff0c;高性能低占用的博客系統&#xff0c;這也許是我個人目前寫過的性能最高的web項目了 。目前日均處理請求數80-120w次&#xff0c;同時在線活躍用戶數30-100人&#xff0c;數據量累計已達到100多萬條&#xff0c;數據庫Redis網站主程序同時運行在一…

懷舊服推薦配置_【懷舊服】狂暴戰P4畢業裝備推薦

在懷舊服開啟P4階段之后&#xff0c;狂暴戰玩家的輸出也得到了進一步的提升。當然&#xff0c;狂暴戰想要打出足夠的傷害離不開對應的裝備&#xff0c;現在就給大家介紹下狂暴戰P4階段的BIS裝備。散件裝備狂暴戰在這一階段依舊有非常不錯的散件裝備&#xff0c;個人建議玩家入手…

高斯混合模型GMM及EM迭代求解算法(含代碼實現)

高斯混合模型GMM及EM迭代求解算法&#xff08;含代碼實現&#xff09; 高斯分布與高斯混合模型 高斯分布 高斯分布大家都很熟悉了&#xff0c;下面是一元高斯分布的概率密度函數&#xff08;Probability Density Function&#xff0c;PDF&#xff09;&#xff1a; P(x)N(μ,…

十個模塊_專欄 | ABAQUS Part模塊的十個小技巧

作者介紹星辰_北極星2012年開始從事Abaqus仿真相關工作&#xff0c;服務大小課題逾百項; 主要仿真領域&#xff1a;石油工程、巖土工程和金屬加工工藝&#xff1b; 重點研究方向&#xff1a;ABAQUS GUI二次開發、固體力學、斷裂以及損傷等。Abaqus有部件(Part)和裝配體(Assembl…

深度學習時代的視頻理解綜述

深度學習時代的視頻理解綜述 本文為b站bryanyzhu老師四期視頻理解相關論文解讀的匯總圖文筆記。 我們先精讀深度學習時代視頻理解領域最為重要的兩篇論文&#xff1a;雙流網絡和 I3D。它們分別是領域內兩大類方法雙流&#xff08;利用光流&#xff09;網絡和 3D CNN 網絡的代…

typec擴展塢hdmi沒反應_typec擴展塢轉hdmi/vga多功能網口usb轉換器蘋果華為電腦matebook6元優惠券券后價26.8元...

★typec擴展塢轉hdmi/vga多功能網口usb轉換器蘋果華為電腦matebook&#xff0c;6元拼多多優惠券★券后價26.8元★★★typec擴展塢轉hdmi/vga多功能網口usb轉換器蘋果華為電腦matebook&#xffe5;26.8元&#xffe5;32.8元已拼5097件點擊搶購猜你喜歡[速發]喵喵機P1熱敏打印機手…

NLP任務概覽

NLP任務概覽 本文為臺灣大學李宏毅老師視頻課程筆記。本課程介紹了 &#xff08;2020年&#xff09;NLP 領域常見的 17 種任務。本文只會從輸入輸出的角度概覽多種 NLP 任務&#xff0c;并簡介它們的常見做法&#xff0c;并不會細致地介紹每個任務模型的具體細節。 兩種模式與…

大物實驗總結模板_期中總結大會amp;期末動員大會

在逐漸降溫的雙創周麥包坊的期中總結暨期末動員大會來啦在學長團和小麥包的分享下希望大家重新啟航奮斗期末板塊一學長團經驗分享面對本學期十二門科目&#xff0c;作為過來人的前輩們給出很多對本學期各科目的針對性建議&#xff0c;可謂是干貨滿滿&#xff0c;快來瞧瞧吧&…

PTMs:NLP預訓練模型的全面總結

PTMs&#xff1a;NLP預訓練模型的全面總結 轉自&#xff1a;https://zhuanlan.zhihu.com/p/115014536 預訓練模型(Pre-trained Models,PTMs) 的出現將NLP帶入了一個全新時代。2020年3月18日&#xff0c;邱錫鵬老師發表了關于NLP預訓練模型的綜述《Pre-trained Models for Natur…

python中提取幾列_Python一鍵提取PDF中的表格到Excel(實例50)

從PDF文件獲取表格中的數據&#xff0c;也是日常辦公容易涉及到的一項工作。一個一個復制吧&#xff0c;效率確實太低了。用Python從PDF文檔中提取表格數據&#xff0c;并寫入Excel文件&#xff0c;灰常灰常高效。上市公司的年報往往包含幾百張表格&#xff0c;用它作為例子再合…

EM算法公式推導

EM算法公式推導 EM 算法是一種用來進行含有隱變量的概率生成模型參數估計的迭代算法。 EM算法步驟 EM 算法通過迭代求 L(θ)log?P(X∣θ)L(\theta)\log P(X|\theta)L(θ)logP(X∣θ) 的極大似然估計&#xff0c;每次迭代包含兩部&#xff1a;E步&#xff0c;求期望&#xf…

詳解最大似然估計(MLE)、最大后驗概率估計(MAP),以及貝葉斯公式的理解

詳解最大似然估計&#xff08;MLE&#xff09;、最大后驗概率估計&#xff08;MAP&#xff09;&#xff0c;以及貝葉斯公式的理解 聲明&#xff1a;本文為原創文章&#xff0c;發表于nebulaf91的csdn博客。歡迎轉載&#xff0c;但請務必保留本信息&#xff0c;注明文章出處。 本…

elemntui icon 大小_自定義elementui中的圖標

前提elementui圖標庫圖標較少當你想用elementui的控件而不想用它的圖標時&#xff0c;就可以使用自定義的方式來實現實現el-icon-my-export為我自定義的圖標命名導出//使用圖片來替換//before屬性中的content文本是用來占位的,必須有//可以設置字體大小來確定大小//使用visibil…

變分推斷公式推導

變分推斷公式推導 背景介紹 機器學習中的概率模型可分為頻率派和貝葉斯派。頻率派最終是求一個優化問題&#xff0c;而貝葉斯派則是求一個積分問題。 頻率派 舉幾個例子&#xff1a; 線性回歸 樣本數據&#xff1a;{(xi,yi)}i1N\{(x_i,y_i)\}_{i1}^N{(xi?,yi?)}i1N? 模…

重新打開_iPhone 應用停止響應或無法打開的解決辦法

如果當您在 iPhone 上使用某個重要應用時&#xff0c;遇到應用停止響應、意外退出或無法打開的問題&#xff0c;請參考如下步驟嘗試解決&#xff1a;1.強制退出應用&#xff1a;在 iPhone 后臺強制關閉該應用之后&#xff0c;再次重新打開看看。2.重啟您的設備&#xff0c;然后…

機器學習理論——優雅的模型:變分自編碼器(VAE)

機器學習理論——優雅的模型&#xff1a;變分自編碼器&#xff08;VAE&#xff09; 轉自&#xff1a;機器學習理論—優雅的模型&#xff08;一&#xff09;&#xff1a;變分自編碼器&#xff08;VAE&#xff09; 另外直觀理解 VAE&#xff0c; 推薦 臺大李宏毅老師的課程&#…