Rust修仙之道 第十四章 宏灵境 · 灵咒重铸之术
第十四章:宏灵境 · 灵咒重铸之术
“术之极者,可铸术自身;言之极者,语法亦可铸。”
顾行云在整理灵术模块时,发现冗余术式重复繁复,若能一术生万术,岂非大成?
此时,一道灵书显现:《宏灵咒典》。
一、声明式宏:macro_rules! 之符
这是一种模式匹配式灵咒,可根据输入匹配并展开。
示例:打印多个灵符
macro_rules! summon {
($($x:expr),*) => {
$(
println!("召唤灵符:{}", $x);
)*
};
}
fn main() {
summon!("火符", "冰符", "雷符");
}
他惊叹:“这不只是语法糖,这是咒语工厂!”
关键要素:
$():重复匹配模式*:任意多个(或可用+表示至少一个)$x:expr:匹配表达式
二、派生宏(derive)之术
顾行云曾手写 Debug / Clone 等 trait 实现疲惫不堪,直到他发现派生宏之术:
#[derive(Debug, Clone, PartialEq)]
struct Spell {
name: String,
level: u32,
}
编译灵印自动生成对应 trait 实现,让灵体拥有“调试视界”、“复制术”等能力。
三、过程宏:自造灵纹之顶阶术
若要定义新的属性宏、嵌套规则、改变语法结构,必须使用 proc_macro!
步骤如下:
- 创建专属宏法门包(类库)
cargo new spell_macro --lib
- 在
lib.rs中启用:
extern crate proc_macro;
use proc_macro::TokenStream;
#[proc_macro]
pub fn spirit_bless(input: TokenStream) -> TokenStream {
// 处理语法树,生成新代码
input
}
- 在主项目中调用:
use spell_macro::spirit_bless;
spirit_bless! {
fn chant() {
println!(" 灵术被祝福");
}
}
顾行云逐渐熟练 quote!, syn 等神级语义操控库,如法如术,开辟自己的语法领域。
宏灵诀 · 拓语之理
语不止所见,亦可被构;术不止于写,亦可自生;宏者,道中之神铸也。
Rust修仙之道 第十四章 宏灵境 · 灵咒重铸之术的更多相关文章
- C#语言和SQL Server第十三 十四章笔记
十三章 使用ADO.NET访问数据库 十四章使用ADO.NET查询和操作数据库 十三章: ...
- 《Linux命令行与shell脚本编程大全》 第十四章 学习笔记
第十四章:呈现数据 理解输入与输出 标准文件描述符 文件描述符 缩写 描述 0 STDIN 标准输入 1 STDOUT 标准输出 2 STDERR 标准错误 1.STDIN 代表标准输入.对于终端界面 ...
- perl 第十四章 Perl5的包和模块
第十四章 Perl5的包和模块 by flamephoenix 一.require函数 1.require函数和子程序库 2.用require指定Perl版本二.包 1.包的定义 2.在包间切 ...
- Gradle 1.12 翻译——第十四章. 教程 - 杂七杂八
有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com ...
- C和指针 (pointers on C)——第十四章:预处理器
第十四章 预处理器 我跳过了先进的指针主题的章节. 太多的技巧,太学科不适合今天的我.但我真的读,读懂.假设谁读了私下能够交流一下.有的小技巧还是非常有意思. 预处理器这一章的内容.大家肯定都用过.什 ...
- CSS3秘笈复习:十三章&十四章&十五章&十六章&十七章
第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮 ...
- JavaScript高级程序设计:第十四章
第十四章 一.表单的基础知识 在HTML中,表单是由<form>元素来表示的,而在javascript中,表单对应的则是HTMLFormElement类型.HTMLFormElement继 ...
- Gradle 1.12用户指南翻译——第二十四章. Groovy 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
- Gradle 1.12用户指南翻译——第三十四章. JaCoCo 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- Gradle 1.12用户指南翻译——第四十四章. 分发插件
本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
随机推荐
- 解决VSCODE进行C代码编辑时结构体成员不可见或不提示的问题
在使用VSCODE进行C代码编辑时,结构体成员有时可见,光标放到成员上时,系统会提示结构体成员对应的注释信息,但是有时候却不行. 经过测试,发现有如下规律:以test.c test.h include ...
- javaWeb基础之会话(Cookies、Session)
一. 1. 会话:一次会话中包含多次请求和响应 2. 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止[浏览器关闭或服务器关闭] 功能:在一次会话的范围内的多次请求间,共享数据 ...
- VScode前端代码编辑器:修改默认打开的浏览器和代码提示设置
一.修改默认打开的浏览器 二.代码提示设置
- 在SqlSugar的开发框架中增加对低代码EAV模型(实体-属性-值)的WebAPI实现支持
我在前面随笔中介绍了在SqlSugar的开发框架中实现EAV模型(实体-属性-值)的处理,这个EAV模型实现的目的是支持弹性化的数据库设计,可以自由扩展数据库表字段和数据的查询和存储,实现的思路是在常 ...
- test-同步111
视频如何拍? 旅拍技巧 旅拍微电影必拍内容 只要用这个思路,用手机拍也可以,只是相机效果更好一些. #小雨朵 #摄影教学 #旅行vlog #川西美景 #把生活拍成电影 - 抖音 (douyin.com ...
- git 更新和强制更新失败
Your local changes to the following files would be overwritten by mergeerror: Your local changes to ...
- C# 线程基础——用户模式、内核模式
C# 线程基础--用户模式.内核模式 参照:用户模式和内核模式 - Windows drivers | Microsoft Docs 基础概念 运行 Windows 的计算机中的处理器有两个不同模式: ...
- 导入别人的android studio项目
在导入别人的android studio项目(假设为项目A)时,会遇到gradle不一致的情况,以下简短介绍解决方法: 1. 打开要导入的项目的目录,删除下图红框中的文件. 2. 找到自己以前在自己的 ...
- servlet 转发与重定向
目录 转发 重定向 重定向与转发本质都是跳转到新的URL 重定向与转发的本质区别在于:转发是一个服务端的行为,而重定向是一个浏览器的行为. 下面是图解: 转发 转发的作用在服务器端,将请求发送给服务器 ...
- Gin 封装原生sql + jwt 实现 web
最近工作之余学了一下 Go 语言, 在此之前是先学了一段时间的 rust, 真的是从入门到放弃, 根本搞不懂, 于是果断转 Go 了, 为啥不继续用 Java 呢, 就是觉得它很啰嗦, 代码量还大, ...