11

是否可以构建一个不输出任何内容但存储状态以构建列表的宏,然后再构建一个实际使用该数据的第二个宏?

例如:

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,        
    }
}
4

1 回答 1

12

目前没有官方支持的存储状态的方法可以被两个不同的 proc 宏调用使用。我在讨论这个问题的地方创建了这个非常相关的问题

存储状态当然是可能的,但只是以一种 hacky 的方式。例如,您可以将所有状态序列化为/tmp/my-state. 或者您可以尝试使用static全局变量。但是,即使现在可以使用,也不能保证将来可以使用。另一个问题:由于增量编译,不能保证所有 proc 宏调用都实际执行。因此,如果您有一个生成状态的宏和一个读取状态的宏,如果第一个没有执行,就会发生非常奇怪的事情。因此,存储全局状态在技术上是可行的,但不建议这样做。

在上面链接的问题中,您可以看到 MSleepyPanda提出了一个可能的解决方案,但我们远未实现。

于 2018-10-21T09:53:24.203 回答