从1.0开始,This site在Rust中使用了六种语法扩展.DecoratorModifierMultiModifierNormalTTIdentTTMacroRulesTT.

不幸的是,它与这些(以及相关的编译器扩展)项的文档的所有链接似乎都已失效.事实上,即使手动搜索Rust文档中的SyntaxExtensionsyntax模块,也不会产生任何结果.它似乎是在主分支的主要 rust 迹储存库中,所以这显然不是仅仅在某个地方的苗圃中.

值得注意的是,该页面提到,在某个时间点"很快"(从1.0开始)MultiModifierModifier可能会合并,但由于文件消失,我无法确认这一点,截至目前的夜间.

book只记录了基本的lint和"过程宏",它们的范围似乎相当有限.

那么,到目前为止,还有6种语法扩展类型吗?他们的文件是否在新的地点保持最新?它们的功能是否仍与1.0前后大致相同?

推荐答案

那个地方已经很过时了——那是在铁 rust 稳定之前.Rust 1.20中唯一支持的"插件/语法扩展"是示例宏和自定义派生,两者都在The Rust Programming Language中.不稳定Rust 也有custom attributesprocedural macros,但这两种Rust 在稳定之前可能会发生变化.

该站点中列出的扩展类型与当前宏类型的粗略映射如下:

  • Decorator -> Custom Derive
  • Modifier, MultiModifier -> Custom Attribute
  • NormalTT -> Procedural Macros
  • IdentTT -> Procedural Macros (I don't entirely understand what they are though, so I'm not sure)
  • MacroRulesTT -> Macros by Example (a.k.a. Declarative Macros)

宏的例子很容易找到(例如stdlog crate 广泛使用它们).serde_derive crate 可能是使用自定义派生的最佳示例.

UPDATE:

程序宏(包括自定义属性)在Rust 1.30中稳定.见https://doc.rust-lang.org/stable/book/ch19-06-macros.html

Rust相关问答推荐

有没有方法处理rust中嵌套的ok_or()?

我怎样才能从一个Rust 的日期中go 掉3年?

值为可变对象的不可变HashMap

如果LET;使用布尔表达式链接(&Q);

如何在Tauri中将变量从后端传递到前端

如何提高自定义迭代器的`extend`性能

如何删除Mac Tauri上的停靠图标?

为什么我们需要std::thread::scope,如果我们可以使用thread.join()在函数的生命周期内删除引用?

try 实现线程安全的缓存

write_buffer 不写入缓冲区而是输出零 WGPU

为什么我们有两种方法来包含 serde_derive?

Google chrome 和 Apple M1 中的计算着色器

如何保存指向持有引用数据的指针?

在不安全的 Rust 中存储对 struct 内部数据的静态引用是否合法?

返回引用字符串的future

预期的整数,找到 `&{integer}`

字符串切片的向量超出范围但原始字符串仍然存在,为什么判断器说有错误?

使用泛型作为关联类型,没有幻像数据

将数据序列化为 struct 模型,其中两个字段的数据是根据 struct 中的其他字段计算的

A 有一个函数,它在 Option<> 类型中时无法编译,但在 Option<> 类型之外会自行编译.为什么?