如何在程序宏中通过名称获取有关特征的信息?

问题描述 投票:0回答:3

我正在编写一个过程宏,它将接受特征的名称并生成一个新类型结构,该结构存储该特征的实现者(

T
)并通过使用
T
上的实现来实现该特征。实际上,这种新型结构隔离了对象的一个特征,并将所有其他特征的实现“密封在内部”。

为了正确工作,宏需要在调用站点的范围内找到特征(这可以通过与调用相同的方式引用特征来轻松完成),根据特征名称生成新类型的名称(在我的例子中,

Only{trait_name}
,例如
OnlyDisplay
),获取特征中的方法和关联函数/类型/常量的列表,并使用
self.{method_name}({parameters})
(对于方法)或
Self::{assoc_name}
(对于关联)实现它们成员。这一步让我感到困惑:Sync crate 和
proc_macro
都没有提供通过
Ident
定位特征并在事后反思它们的方法。

那么,如何在当前范围内通过

Ident
定位特征并获取其定义中所有内容的列表?

rust macros metaprogramming
3个回答
3
投票

简短回答:你不能。当执行 proc-macro 时,编译器所知道的就是源代码的标记化;也就是说,它知道源解析。编译器对类型一无所知,哪些标识指代什么以及如何理解其中任何一个。

您可能想更新有关您的意图的问题:您实际上想实现什么目标?


2
投票

你不能。在完成任何语义分析之前宏会被扩展,并且此时名称不会被解析。

您最好的选择是执行类似 serde 的远程属性 的操作并重复特征定义。


0
投票

板条箱 enum_dispatch 执行您正在寻找的操作。看一下

中的cache_trait函数

https://gitlab.com/antonok/enum_dispatch/-/blob/master/src/cache.rs?ref_type=heads

它将特征定义存储在惰性静态中,可以在定义 proc 宏时查询。

© www.soinside.com 2019 - 2024. All rights reserved.