日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2025/3/8 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 max std value 宏_Rust Macro/宏 新手指南 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

相關(guān)鏈接:在線學(xué)編程 - 匯智網(wǎng)

1、什么是Rust的宏/Macro?

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

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

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

不理解也沒有關(guān)系,讓我們繼續(xù)看。

2、如果創(chuàng)建Rust宏/Macro?

可以使用Rust預(yù)置的macro_rules!宏來創(chuàng)建一個新的Rust宏。

下圖展示了如何創(chuàng)建一個空白的Rust宏:hey!,這個宏什么功能 也沒有,我們現(xiàn)在只關(guān)注它的結(jié)構(gòu):

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

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

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

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

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

3、模式匹配與變量捕捉

現(xiàn)在我們看看Rust宏的模式是如何匹配的。

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

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

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

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

那么,現(xiàn)在如何在轉(zhuǎn)碼器/Transcriber中應(yīng)用我們捕捉到的變量?

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

4、編寫第一個Rust宏

我們已經(jīng)了解了如何編寫一個Rust宏,現(xiàn)在讓我們動手寫一個:

很簡單,對吧?

5、重復(fù)模式的提取與利用

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

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

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

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

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

6、用重復(fù)模式在Rust中實現(xiàn)Ruby的哈希表語法

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

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

答案是使用重復(fù)匹配:

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

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

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

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

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

好了,讓我們看看完整的map!宏實現(xiàn):

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

COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL.


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

總結(jié)

以上是生活随笔為你收集整理的max std value 宏_Rust Macro/宏 新手指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产成人a v| 国内精品国产三级国产aⅴ久 | 97精品一区 | 亚洲图片一区二区三区 | 草逼视频网 | 国精产品99永久一区一区 | 精品无码人妻少妇久久久久久 | 日韩精品极品 | 视频一区二区欧美 | 国产在线观看无码免费视频 | 国产精品理论在线观看 | 黄色香蕉网| 久久久久久少妇 | 精品福利片 | 99超碰在线观看 | 黄色资源网 | 亚洲中文字幕97久久精品少妇 | 成av在线 | 亚洲同性gay激情无套 | av大片在线播放 | 激情av网| 九九视频网 | xxxxx国产 | 久久一级电影 | 国产美女免费无遮挡 | 国产成人在线观看免费网站 | 亚洲男人的天堂av | 精品综合在线 | 一级片免费网址 | 双性娇喘浑圆奶水h男男漫画 | 在线观看免费高清在线观看 | 免费看污黄网站在线观看 | 中文字幕无码日韩专区免费 | 伊人tv | 久久高清免费视频 | 黄色小说图片视频 | 久久高清内射无套 | 好吊色视频一区二区 | 国产在线视频网 | 亚洲黄色片免费看 | 日韩欧美一区二区三区免费观看 | 国产ts在线观看 | 午夜国产在线观看 | 屁屁影院国产第一页 | 玖草在线| 日韩精品免费在线视频 | 毛片网站有哪些 | 伊人www | 精品无码久久久久久国产 | 成人快色| 九九热在线视频 | 亚洲第一黄色网址 | 国产日韩欧美综合 | 337p粉嫩大胆噜噜噜噜69影视 | 日韩亚洲第一页 | 茄子视频懂你更多在线观看 | 无码国产精品久久一区免费 | 少妇太爽了 | 成人精品网 | 日韩伦人妻无码 | 嫩草一二三 | 国产xxx在线 | 强乱中文字幕av一区乱码 | 日韩美女视频在线观看 | 亚洲暴爽 | 久草中文在线视频 | 中文字幕一区二区三区5566 | 欧洲一区二区在线 | 少女视频的播放方法 | 日本韩国中文字幕 | 啪啪免费网址 | 偷拍一区二区三区四区 | 一极毛片 | 国产精品理论片在线观看 | 精品午夜久久 | 九七影院在线观看免费观看电视 | 这里精品 | 中文字幕亚洲精品在线观看 | 国产96在线 | 成人黄色一级片 | 国产人免费人成免费视频 | 亚洲色图清纯唯美 | 久久久夜色精品亚洲 | 成人福利在线免费观看 | 91精品国产一区二区无码 | 国产精品黄色在线观看 | 国产福利电影在线 | 伊人99re | 黄色va| 亚洲深夜在线 | 中文字幕一区2区3区 | 女人黄色片 | 亚洲成人精品 | 免费黄色在线视频 | 亚洲一区二区三区四区五区六区 | 国产香蕉一区 | 老司机伊人 | 夜夜撸av| 羞辱狗奴的句子有哪些 |