最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(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ó)家法律
赫章县| 毕节市| 古田县| 报价| 柳林县| 防城港市| 佛山市| 乌兰浩特市| 五莲县| 鲁山县| 宿州市| 伊吾县| 江西省| 东源县| 田东县| 神农架林区| 田林县| 元江| 三门县| 遵义市| 翼城县| 易门县| 深水埗区| 德阳市| 普安县| 雷州市| 光山县| 永兴县| 若尔盖县| 泰安市| 惠东县| 黎川县| 江都市| 芷江| 浑源县| 友谊县| 漠河县| 敦煌市| 佛坪县| 民丰县| 碌曲县|