rust - 如何通过具有语法扩展的特征标识符获取原始 AST?

标签 rust metaprogramming traits rust-compiler-plugin

当我尝试使用语法扩展以编程方式实现特征时,我陷入了困境。

我在这里写了一个最小的例子。我希望有人可以提供帮助(或为我指明正确的方向)。

// Just some methods collection I want to implement programmatically.
trait TraitToHack {
    fn implement_me(&self) -> int; // Say, I'd like to implement this method programmatically to return 42.
}

// I create dummy struct and wrap it with special attribute.
#[AttributeToHack(TraitToHack)]
struct StructToHack;

// I register syntax extension based on Decorator. Its signature is something like this:
// fn expand(cx: &mut ext::base::ExtCtxt, span: codemap::Span, mitem: &ast::MetaItem, item: &ast::Item, push: |P<ast::Item>|) { .. }
// This is where I got stuck :(    
fn main() {
    let hack = StructToHack;
    hack.implement_me(); // Must return 42.
}

问题是:

  • 如何从 AST 上下文中获取 Trait 标识符?
  • 如何从该标识符获取方法名称以及如何使用语法扩展来实现它们?

最佳答案

你不能。

诸如宏和属性之类的语法扩展在名称解析之前进行扩展。这意味着虽然您可以获得标识符 TraitToHack,但您无法从中提取有关该特征的任何信息。

下一个最好的事情是专门为特征实现一个属性,它对所述特征有硬编码的理解(因为该属性是针对TraitToHack,它知道它必须实现implement_me)。这或多或少就是deriving 的工作原理:每个受支持的特征都有一个单独的扩展函数。

关于rust - 如何通过具有语法扩展的特征标识符获取原始 AST?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27185147/

相关文章:

oop - 是否可以从特征中访问结构字段?

c++ - 用消息 boost static_assert?

metaprogramming - "Registering"特征实现+特征对象的工厂方法

scala - 通用 trait 的 case 对象

rust - 如何为实现特定特征的所有类型批量实现反序列化?

rust - 使用泛型时无法借用自己的结构成员作为可变成员

windows - Rust 程序需要 libusb DLL 存在,即使它是静态链接的

collections - 如何通过结构相等检查结构集合中的结构?

rust - 将通用类型限制为原始数字类型

macros - 使用 Racket 宏生成 require-clauses