当我尝试使用语法扩展以编程方式实现特征时,我陷入了困境。
我在这里写了一个最小的例子。我希望有人能提供帮助(或为我指出正确的方向)。
// 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 上下文中获取特征标识符?
- 如何从该标识符中获取方法名称以及如何使用语法扩展实现它们?
你不能。
宏和属性等语法扩展在名称解析之前展开。 这意味着虽然你可以得到标识符TraitToHack
,但你将无法从中提取任何关于特征的信息。
下一个最好的办法是专门为特征实现一个属性,该属性对所述特征有一个硬编码的理解(即因为该属性是针对TraitToHack
的,它知道它必须实现implement_me
)。 这或多或少是deriving
的工作方式:每个支持的特征都有一个单独的扩展函数。