五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【Rust】類函數(shù)宏 | Rust宏入門

2023-03-28 04:17 作者:Louis翔  | 我要投稿

本筆記總結(jié)自The Little Book of Rust Macros

我對(duì)其中的案例有所簡(jiǎn)化

bilibili不支持markdown是真的難頂

概述

宏的種類

Attributes

內(nèi)置宏 built-in?

過(guò)程宏 proc-macro?

派生宏 derive

函數(shù)式的宏

AKA 類函數(shù)宏

macro_rules!

宏的變種,一般只考慮macro_rules!這一個(gè)宏

宏展開(kāi)

很像 C 的 Define,在編譯時(shí)自動(dòng)替換

rust 中的宏是在 AST 之后展開(kāi),自己會(huì)加括號(hào),不會(huì)改變運(yùn)算順序

衛(wèi)生性

hygiene 一個(gè)概念,簡(jiǎn)單理解為:宏不應(yīng)該隱式地改變或創(chuàng)建變量

比如一個(gè)宏,用戶沒(méi)有傳入變量a,但它把a的值改變了;或者它創(chuàng)建了變量b,但始終沒(méi)有move或drop,就不衛(wèi)生

調(diào)試

rustc +nightly -Zunpretty=expanded hello.rs

思路

基本語(yǔ)法

expansion 也可以叫做 transcriber


matcher

匹配()或胡言亂語(yǔ)

匹配元變量

該例中,matcher$($elem: expr),*

元變量

有一個(gè)特殊的元變量叫做 $crate ,它用來(lái)指代當(dāng)前 crate 。

小例子:

反復(fù)

repetition

語(yǔ)法:

$(...) sep rep

其中:

  • $: a token (token意為標(biāo)記)

  • (...): the matcher which need repetition

  • sep: an optional separator token; example:, ;

  • rep:

    • ?appear zero or one time

    • * appear any times

    • +appear once or more

Example:

?

多個(gè)變量的情況:

macro metavariable expressions

Unstable now (2023.3.27) and we can not use it in a stable channel

實(shí)戰(zhàn)

斐波納切數(shù)列


構(gòu)建步驟

  • 確定調(diào)用形式

  • 確定想要生成的代碼

  • 改善調(diào)用形式

  • 初步構(gòu)建

  • 替換

  • 測(cè)試

  • 導(dǎo)出

確定調(diào)用形式

據(jù)此,初步構(gòu)建宏:

依次匹配:

  • 字面量:a[n] =

  • 一個(gè)及以上的表達(dá)式(expr)

  • 字面量:, ... ,

  • 一個(gè)表達(dá)式(expr),本例中,此為通式

確定想要生成的代碼

?

改善調(diào)用形式

在 coding 的過(guò)程中發(fā)現(xiàn),用戶可能需要能夠自定義迭代器中Item的類型

故修改宏的調(diào)用形式為:

據(jù)此初步構(gòu)建宏:

初步構(gòu)建

將前面幾個(gè)步驟的結(jié)果組合在一起

?

cargo test

?

這是由于在某次版本更新后, expr 之后只能跟隨 =>,、; 之一

故解決方法為用 ;...; 代替 ,..., ,修改以下兩行:

當(dāng)前完整代碼:

?

替換

完成后:

?

cargo test

?

據(jù)說(shuō)在 nightly 版本中,可以變異通過(guò)。此處不通過(guò)的原因在于,測(cè)試中的 an 與宏中的 an 具有不同的上下文,解決方法是:

?

這樣,rustc 才能推斷出 anident(identifier)

其他測(cè)試

?

導(dǎo)出宏

?

完整代碼

?


【Rust】類函數(shù)宏 | Rust宏入門的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
滨州市| 宣汉县| 岳普湖县| 九龙县| 三江| 遵义县| 旬阳县| 白城市| 沛县| 当雄县| 乌鲁木齐县| 融水| 东兰县| 获嘉县| 元江| 沙坪坝区| 上虞市| 额敏县| 菏泽市| 正蓝旗| 龙陵县| 洛南县| 上栗县| 阿巴嘎旗| 花莲市| 黔东| 教育| 青河县| 大荔县| 西乌珠穆沁旗| 连江县| 仙居县| 凌海市| 建始县| 翁牛特旗| 黄陵县| 桑植县| 浠水县| 资源县| 富平县| 正蓝旗|