2017-02-13 81 views
3

我正在實施一個程序宏,我需要向外部提供我自己的結構。我需要爲我的結構實施quote::ToTokens特徵,但我不明白。我試過這段代碼,但沒有成功。該代碼編譯,但它是無效的:如何爲枚舉實現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沒有解釋這一點。

回答

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 ::」?就我個人而言,我認爲必須有一種方法來獲取所需項目的「完全限定名稱」。附:我的問題意味着你的答案中的代碼也是不正確的:) –

+1

也許你應該總是使用完全限定的名字,包括箱子,只是爲了安全起見。雖然這很難看。我會更新答案。 –

+0

你可以在函數中使用它,那麼你只需要在impl和use中自己定義它。 – Kroltan