有没有可能构建一个不输出任何内容,而是存储状态的宏来构建一个列表,然后再构建一个实际使用该数据的宏?

例如:

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

推荐答案

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

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

在上面链接的问题中,你可以看到MSleepyPanda proposed a possible solution,但我们还远没有实现这一点.

Rust相关问答推荐

如何在Rust中为具有多个数据持有者的enum变体编写文档 comments ?

如何从使用mockall模拟的方法中返回self?

如何从铁 rust 中呼唤_mm_256_mul_ph?

如何go 除铁 rust 中路径组件的第一项和最后一项?

从Type::new()调用函数

用 rust 蚀中的future 展望 struct 的future

为什么这个变量不需要是可变的?

变量需要parse()中的显式类型

用于实现获取 struct 体 id 的特征规范

UnsafeCell:它如何通知 rustc Select 退出基于别名的优化?

如何在Rust中使用Serde创建一个自定义的反序列化器来处理带有内部标记的枚举

Rust中的标记特征是什么?

Rust Redis 中的 HSET 命令问题

将 Futures 的生命周期特征绑定到 fn 参数

为什么 Rust 允许写入不可变的 RwLock?

有没有办法在 Rust 中对 BigInt 进行正确的位移?

如果我立即等待,为什么 `tokio::spawn` 需要一个 `'static` 生命周期?

传递 Option<&mut T> 时何时需要 mut

如何在 Rust 中构建一个 str

为什么这里需要类型注解?