Rust 的宏

作者: 阿瑟李 | 来源:发表于2017-08-01 20:18 被阅读686次

首先, 我感觉 Rust 的宏是非常强大的, 可以根据 match 有不同的实现,但是它也是极其让人,起码是让我纠结的和费解的, 我希望能够一点点的弄懂他

文档来看

// 定义宏的语法
macro_rules! vec {
  // 这里的 * 感觉是一种连续的匹配值
    ( $( $x:expr ),* ) => {
        {
            let mut temp_vec = Vec::new();
            // $()*的语法在我看来就是一种迭代器,让我们迭代所有的匹配结果
            $(
                temp_vec.push($x);
            )*
            temp_vec
        }
    };
}

在一些复杂的宏中, 甚至用到了一些递归的写法
我们在 匹配的时候发现 匹配到的值后面有 :expr, 文档中也给出了一系列规则

ident: 标识符,用来表示函数或变量名
expr: 表达式
block: 代码块,用花括号包起来的多个语句
pat: 模式,普通模式匹配(非宏本身的模式)中的模式,例如 Some(t), (3, 'a', _)
path: 路径,注意这里不是操作系统中的文件路径,而是用双冒号分隔的限定名(qualified name),如 std::cmp::PartialOrd
tt: 单个语法树
ty: 类型,语义层面的类型,如 i32, char
item: 条目,
meta: 元条目
stmt: 单条语句,如 let a = 42;

#[macro_use] 表示子模块的宏可以被父模块调用
#[macro_export] 表示可以被其他的 crate 调用
$crate 在宏中表示该模块

实例解析

error_chain 这个类库就是一个使用宏的范例,我们今天就来看一下
这个库的主要功能就是通过简单的设置,让宏来完成所有重复的代码

基本的实现就是 通过一步步的宏的迭代,把需要的参数排序并且解析出来,之后再通过解析出来的参数,组合并且返回相应的代码块,代码块中已经把 错误类型, 错误文档, 错误代码 全部都自动组合好

相关文章

  • 关于rust的“宏”

    一、概述 为了解决rust语法元素的扩展,并能复用现有的代码,在rust编写的程序中普遍使用宏.通过宏定义和宏调用...

  • vs code 配置rust开发环境

    实现的需求: 查看宏定义,代码补全, 安装这三个插件: Rust,Rust Test Lens,rust-anal...

  • Rust语言编程实例100题-048

    Rust语言编程实例100题-048 题目:Rust 对宏(macro)有着非常好的支持。宏能够使得你能够通过写代...

  • Rust 的宏

    首先, 我感觉 Rust 的宏是非常强大的, 可以根据 match 有不同的实现,但是它也是极其让人,起码是让我纠...

  • 宏(Macro)指的是 Rust 中一系列的功能 声明(Declarative)宏, 使用macro_rules!...

  • 【RUST_BASIC】Rust 宏

    参考 https://kaisery.github.io/trpl-zh-cn/ch19-06-macros.ht...

  • rust--宏

  • rust - macro_rules! 过程宏学习笔记 macr

    rust中宏大致分两种:过程宏: 形如 println!(), vec!() 这类属性宏: 形如 #[deriv...

  • 关于rust宏补充(二)-派生过程宏示例

    rust中过程宏示例: 准备工作 定义一个过程宏: proc_macro_derive 测试 更多例子[https...

  • 关于rust宏-过程宏(补充)

    一、 rust编译过程 从上面的编译过程图,可以看到 和 被编译到AST中过程是不同的: 声明宏:通过macro_...

网友评论

    本文标题:Rust 的宏

    本文链接:https://www.haomeiwen.com/subject/evfslxtx.html