可以在Rust的过程宏中存储状态吗?

mwngjboj  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(82)

有没有可能构建一个宏,它不输出任何东西,而是例如存储状态以构建一个列表,然后第二个宏将实际使用该数据并输出一些结果?
例如:

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,        
    }
}
6g8kf2rb

6g8kf2rb1#

目前还没有官方支持的方法来存储可由两个不同的proc宏调用使用的状态。我在讨论这个问题的地方创建了this very related issue
存储状态当然是可能的,但只是以一种笨拙的方式。例如,您可以将所有状态序列化为/tmp/my-state。或者你可以尝试使用static全局变量。但是,即使这在现在起作用,也不能保证在未来起作用。另一个问题:由于增量编译,不能保证所有的proc宏调用都被执行。因此,如果你有一个生成状态的宏和一个读取状态的宏,如果第一个宏没有执行,就会发生非常奇怪的事情。因此,从技术上讲,存储全局状态是可能的,但这并不可取。
在上面链接的问题中,您可以看到MSleepyPanda提出了一个可能的解决方案,但我们还远未实现。

相关问题