如何为枚举实现 quote::ToTokens ?

Vic*_*voy 5 enums quote rust

我正在实现一个程序宏,我需要向外部提供我自己的结构。我需要quote::ToTokens为我的结构实现特征,但我不明白如何实现。我已经尝试过这段代码但没有成功。此代码可以编译,但无效:

#[derive(Debug, Serialize, Clone)]
pub enum Enum {
    A,
    B,
}
impl quote::ToTokens for Enum {
    fn to_tokens(&self, tokens: &mut quote::Tokens) {
        tokens.append("Enum::B");
    }
}
Run Code Online (Sandbox Code Playgroud)

quote::ToTokens示例没有解释这一点。

Pet*_*all 2

我认为您正在寻找类似的东西:

impl quote::ToTokens for Enum {
    fn to_tokens(&self, tokens: &mut quote::Tokens) {
        tokens.append("Enum");
        tokens.append("::");
        match *self {
           Enum::A => tokens.append("A"),
           Enum::B => tokens.append("B")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您担心枚举是如何导入的,那么您应该重新导入它以确保它不与其他任何内容冲突:

impl quote::ToTokens for Enum {
    fn to_tokens(&self, tokens: &mut quote::Tokens) {
        tokens.append("{");
        tokens.append("use");
        tokens.append_separated(&["module_name", "Enum"], "::");
        tokens.append(";");
        tokens.append("Enum");
        tokens.append("::");
        match *self {
           Enum::A => tokens.append("A"),
           Enum::B => tokens.append("B")
        }
        tokens.append("}");
    }
}
Run Code Online (Sandbox Code Playgroud)

这将产生:

 { use module_name::Enum; Enum::A }
Run Code Online (Sandbox Code Playgroud)

  • 这个答案已经过时了。`tokens.append(&str)` 不再有效。 (4认同)
  • @福特O。现在有什么选择?刚刚遇到这个问题 (3认同)