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

Enums 如何为枚举实现quote::ToTokens?,enums,rust,quote,Enums,Rust,Quote,我正在实现一个过程宏,我需要向外界提供我自己的结构。我需要为我的结构实现quote::ToTokenstrait,但我不知道如何实现。我尝试过这个代码,但没有成功。此代码可编译,但无效: #[derive(Debug, Serialize, Clone)] pub enum Enum { A, B, } impl quote::ToTokens for Enum { fn to_tokens(&self, tokens: &mut quote::Token

我正在实现一个过程宏,我需要向外界提供我自己的结构。我需要为我的结构实现
quote::ToTokens
trait,但我不知道如何实现。我尝试过这个代码,但没有成功。此代码可编译,但无效:

#[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");
    }
}

没有解释这一点。

我认为您正在寻找类似于:

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")
        }
    }
}
如果您关心如何导入枚举,则应重新导入它,以确保它与任何其他内容不冲突:

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("}");
    }
}
这将产生:

 { use module_name::Enum; Enum::A }

如果我们的代码中有“use Enum as E;”,或者我们甚至没有为它提供
use
,那么它必须在前面加上“cratename::”,该怎么办?就我个人而言,我认为必须有一种方法来获取所请求项目的
完全限定名称。另外,我的问题意味着你的答案中的代码也不正确:)为了安全起见,你可能应该始终使用完全限定的名称,包括板条箱。不过它很难看。我将更新答案。您可以在函数中使用它一次,然后只需要在impl和
使用它本身中对其进行FQN。此答案已过时<代码>标记。追加(&str)
不再有效。@FordO。现在的替代方案是什么?刚刚碰到这个问题