【问题标题】:How to implement quote::ToTokens for an enum?如何为枚举实现quote::ToTokens?
【发布时间】:2017-02-13 14:26:41
【问题描述】:

我正在实现一个程序宏,我需要向外部提供我自己的结构。我需要为我的结构实现 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");
    }
}

quote::ToTokens example 没有解释这一点。

【问题讨论】:

    标签: enums rust quote


    【解决方案1】:

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

    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 }
    

    【讨论】:

    • 如果我们有“使用 Enum 作为 E;”怎么办?在我们的代码中,或者我们甚至没有为它提供use,所以它必须在前面加上“cratename::”?我个人认为必须有一种方法可以为请求的项目获取fully qualified name。附言我的问题意味着您的答案中的代码也不正确:)
    • 为了安全起见,您可能应该始终使用完全限定名称,包括 crate。虽然它很丑。我会更新答案。
    • 您可以在函数内部使用一次use,然后您只需在 impl 和 use 本身中对其进行 FQN。
    • 这个答案已经过时了。 tokens.append(&str) 不再有效。
    • @FordO。现在有什么选择?刚遇到这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2010-11-12
    • 2022-10-25
    • 2015-05-30
    • 2016-04-05
    • 1970-01-01
    相关资源
    最近更新 更多