网站开发投标书范本目录,料神wordpress建站教程,制作介绍的网站,搜索关键词查询Rust语言最强大的一个特点就是可以创建和利用宏/Macro。不过创建 Rust宏看起来挺复杂#xff0c;常常令刚接触Rust的开发者心生畏惧。这片文章 的目的就是帮助你理解Rust Macro的基本运作原理#xff0c;学习如何创建自己的 Rust宏。相关链接#xff1a;在线学编程 - 汇智网…Rust语言最强大的一个特点就是可以创建和利用宏/Macro。不过创建 Rust宏看起来挺复杂常常令刚接触Rust的开发者心生畏惧。这片文章 的目的就是帮助你理解Rust Macro的基本运作原理学习如何创建自己的 Rust宏。相关链接在线学编程 - 汇智网1、什么是Rust的宏/Macro如果你尝试过Rust应该已经用过Rust的宏了println!。这个宏 可以在终端输出一行文本并且支持变量的插值。简单地说Rust宏让你可以发明自己的语法编写出可以自行展开的代码 也就是我们通常所说的元编程你甚至可以用Rust宏来创作自己的DSL。Rust宏的基本运作机制就是首先匹配宏规则中定义的模式然后将匹配 结果绑定到变量最后展开变量替换后的代码。不理解也没有关系让我们继续看。2、如果创建Rust宏/Macro可以使用Rust预置的macro_rules!宏来创建一个新的Rust宏。下图展示了如何创建一个空白的Rust宏hey!这个宏什么功能 也没有我们现在只关注它的结构() {}看起来很神秘因为它不是标准的rust语法是macro_rules! 这个宏自己发明的用来表示一条宏规则左边是匹配模式右边是 等待展开的代码左边的小括号部分是Rust宏的匹配器/Matcher用来匹配模式并捕捉变量这是我们 发明自定义语法和DSL的关键所在。右边的大括号部分是Rust宏的转码器/Transcriber也就是我们要应用匹配器捕捉到 的变量的部分Rust编译器将利用变量和这部分的代码来生成实际的Rust代码。类似于Rust中的match语句在macro_rules!中可以定义多条宏规则例如macro_rules! hey{ () {}, () {}}3、模式匹配与变量捕捉现在我们看看Rust宏的模式是如何匹配的。在匹配器/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中应用我们捕捉到的变量很简单在Rust宏转码器部分我们只需要在常规的Rust代码中嵌入匹配器 捕捉到的变量就行了没什么特别之处4、编写第一个Rust宏我们已经了解了如何编写一个Rust宏现在让我们动手写一个很简单对吧5、重复模式的提取与利用我们用的许多Rust宏都可以支持非常多的输入。以vec!宏为例我们 可以这样调用它vec![rust macro1,2,3,4,5]或者这样vec![rust macro1,2,3,,4,5,6,7,8]。那么vec!宏是如何实现这一点的很显然它不会去定义成千上万个变量来 逐个保存匹配结果秘密在于重复模式的匹配我们只需要把希望重复的模式写在$(...)这部分然后插入分隔符 在这里也就是逗号最后添加一个*符号表示重复匹配$()中的模式。还有点晕让我们看个具体的例子在这个示例中对于hey!宏我们重复捕捉输入表达式并存入变量$name 也就是说所有捕捉到的表达式都绑定到变量$name了 —— 不妨把 $name 想象成数组变量。6、用重复模式在Rust中实现Ruby的哈希表语法如果你之前写过Ruby程序可能还记得在Ruby中定义哈希表的语法key value。 现在我们可以用Rust宏来在Rust中实现哈希表的这种定义方法在Rust宏的匹配器部分我们使用模式$key:expr $value:expr 来分别捕捉$key和$value表达式分隔符为。 不过现在只能匹配一个键/值对但是哈希表通常都是多个键值对的。应该 如何实现答案是使用重复匹配将我们要匹配的键/值对模式放到$(),*就可以进行重复匹配了。COOL!!那么如何应用捕捉到的键/值对显然我们应该在Rust宏的转码器中创建哈希表对象 然后将捕捉到的所有键值对插入该哈希表在转码器中注意代码中的$()*它的意思是其中的代码会重复展开就像你看到的当我们调用map!(name Finn, gender Boy)时 我们在生成两段重复的代码。key value将被转码为在Rust宏的转码器/transcriber中指定的代码也就是 hm.insert($key, $value)其中$key和$value是我们在Rust宏的匹配器部分 捕捉到的变量。好了让我们看看完整的map!宏实现:只用了几行代码我们就创建了一个功能完整的Rust宏现在让 我们写个小程序测试一下COOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOL.原文链接http://blog.hubwiz.com/2020/01/30/rust-macro/