2017-02-13 10 views
3

私は手続き型マクロを実装しており、自分自身の構造を外部に提供する必要があります。私はquote::ToTokens私の構造の特性を実装する必要がありますが、私はどのように理解できません。私はこのコードを試しましたが、成功しませんでした。このコードはコンパイル可能であるが、それは有効ではありません。引用符:: 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がこれを説明していません。

答えて

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") 
     } 
    } 
} 

:生成されます

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 } 
+0

我々が持っている場合はどう "Eとして列挙型を使用します。"私たちのコードでは、あるいは "use"を与えなかったので、 "cratename ::"を前置する必要がありますか?個人的には、要求されたアイテムに対して '完全修飾名'を取得する方法がなければならないと思います。 P.S.私の質問はあなたの答えのあなたのコードも間違っていることを暗示しています:) –

+1

恐らくあなたは常に安全のためにクレートを含む完全修飾名を使うべきです。しかし、それはかなり醜いです。私は答えを更新します。 –

+0

関数内で関数を一度 '使用する 'ことができます。そして、それをimplと' use'自体でFQNするだけです。 – Kroltan

関連する問題