有没有可能构建一个宏,它不输出任何东西,而是例如存储状态以构建一个列表,然后第二个宏将实际使用该数据并输出一些结果?
例如:
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,
}
}
1条答案
按热度按时间6g8kf2rb1#
目前还没有官方支持的方法来存储可由两个不同的proc宏调用使用的状态。我在讨论这个问题的地方创建了this very related issue。
存储状态当然是可能的,但只是以一种笨拙的方式。例如,您可以将所有状态序列化为
/tmp/my-state
。或者你可以尝试使用static
全局变量。但是,即使这在现在起作用,也不能保证在未来起作用。另一个问题:由于增量编译,不能保证所有的proc宏调用都被执行。因此,如果你有一个生成状态的宏和一个读取状态的宏,如果第一个宏没有执行,就会发生非常奇怪的事情。因此,从技术上讲,存储全局状态是可能的,但这并不可取。在上面链接的问题中,您可以看到MSleepyPanda提出了一个可能的解决方案,但我们还远未实现。