代码之家  ›  专栏  ›  技术社区  ›  Thermatix

在rust的过程宏中,是否可以存储状态?

  •  2
  • Thermatix  · 技术社区  · 7 年前

    有没有可能建立一个宏,它不输出任何东西,而是存储状态来建立一个列表,然后第二个宏将实际使用该数据?

    例如:

    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 回复  |  直到 6 年前
        1
  •  10
  •   Lukas Kalbertodt    6 年前

    目前还没有官方支持的方法来存储可由两个不同的proc宏调用使用的状态。我创造了 this very related issue 讨论这个问题的地方。

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

    在上面链接的问题中,您可以看到MSleepyPanda proposed a possible solution

    推荐文章