是否有可能构建一个不输出任何东西,而是存储状态以构建列表的宏,然后构建一个随后将实际使用该数据的宏?
例如:
trait SomeTrait {}
#[derive(mark)]
struct Person {}
impl SomeTrait for Person {}
#[derive(mark)]
struct Item {}
impl SomeTrait for Item {}
#[derive(mark)]
struct Object {}
impl SomeTrait for Object {}
create_mapper! // this then outputs the below function
//assuming for the fact that data is loaded correctly before this macro is used
fn select_item(kind: String) -> impl SomeTrait {
match kind {
"person" => Person,
"item" => Item,
"object" => Object,
}
}
答案 0 :(得分:5)
否,当前实际上不可能存储可以由两个不同的proc宏调用使用的状态。
我创建了this very related issue来讨论此问题。
今天肯定有可能采用骇人听闻的方式,但是无法保证会奏效。例如,您可以将所有状态序列化为/tmp/my-state
。或者,您可以尝试使用static
全局变量。但是同样,即使现在可以使用,也不能保证将来可以使用。另一个问题:由于进行了增量编译,因此不能保证所有proc宏调用实际上都已执行。因此,如果您有一个宏可以生成状态,而宏可以读取状态,那么如果不执行第一个宏,则会发生真正的奇怪事情。
在上面链接的问题中,您可以看到MSleepyPanda proposed a possible solution,但距离实现这一目标还很遥远。