是否可以在Rust的程序宏中存储状态?

The*_*tix 4 rust rust-macros rust-proc-macros

是否可以构建一个不输出任何东西,而是存储状态以建立列表的宏,然后再构建一个实际使用该数据的宏?

例如:

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,        
    }
}
Run Code Online (Sandbox Code Playgroud)

Luk*_*odt 7

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

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

在上面链接的问题中,您可以看到MSleepyPanda 提出了一种可能的解决方案,但距离实现这一目标还很遥远。

  • 如果您计划在文件系统上序列化和存储状态,我强烈建议将其存储在“OUT_DIR”中(通过从构建脚本导出变量)。这样做将允许货物在调用“货物清理”时自动清理状态,它也将与沙箱货物的安全工具很好地配合。请参阅我对类似问题的回答:/sf/ask/3935082441/ (3认同)