2014-12-04 54 views
2

鏽色程序,我其中我想打印一個數字,或數字的管分隔矢量,因此該簡單的包裝枚舉的使用情況:匹配參數化類型中鏽病

pub enum OneOrMore<T> { 
    One(T), 
    More(Vec<T>) 
} 

其工作正常。但後來我想格式邏輯搬進OneOrMore類型,所以我嘗試:

impl<T: Show> Show for OneOrMore<T> { 
    fn fmt(&self, f: &mut Formatter) -> Result { 
    match self { 
     One(x) => x.fmt(f), 
     More(xs) => /* vec_join(xs, "|") or whatever */, 
    } 
    } 
} 

由於impl是參數,它期待One<T>但我的代碼描述One<_>。問題是我無法弄清楚在哪裏把類型參數放在匹配武器裏面。 syntax guide未給出參數化類型匹配的示例,fmt本身不接受類型參數,並且所有盲目猜測(One(x: T),One<T>(x)等)都不是有效的Rust。任何想法,我應該指出的比賽武器的類型?

回答

4

match表達式中,self的類型爲&OneOrMore<T>,但臂圖案的類型爲OneOrMore<T>;即你在引用上相匹配,但武器不是引用。

你可以改變模式,以引用:

impl<T: Show> Show for OneOrMore<T> { 
    fn fmt(&self, f: &mut Formatter) -> Result<(), Error> { 
    match self { 
     &One(ref x) => x.fmt(f), 
     &More(ref xs) => /* ... */, 
    } 
    } 
} 

或者你可以避免提領self,而不是重複&

impl<T: Show> Show for OneOrMore<T> { 
    fn fmt(&self, f: &mut Formatter) -> Result<(), Error> { 
    match *self { 
     One(ref x) => x.fmt(f), 
     More(ref xs) => /* ... */, 
    } 
    } 
} 

注意,在這兩種情況下,我們需要添加ref關鍵字xxs綁定來創建參考OneOrMore的內部。換句話說,沒有refxxs將是T類型;與ref,他們是類型&T。如果沒有ref,編譯器會抱怨我們試圖將一個值從OneOrMore中移出,這是不允許借用的。

+0

謝謝,我這次完全誤解了編譯器錯誤。 – bees 2014-12-04 04:37:29

+4

順便說一下,標準的鏽風格是'match * foo {Bar =>()}',而不是'match foo {&Bar =>()}',儘管如果匹配的表達式是一個元組,如'match(self,other){(&Foo,&Foo)=>()}'。 – 2014-12-04 06:55:20