2014-09-26 22 views
2

假設我具有實現特徵「Foo」的結構「F1」和「F2」。
現在我想寫一個接受Foo並返回Bar的函數。你如何配合生鏽的特質?

trait Foo { 
    fn get_bar(&self) -> &Bar 
} 
fn do_match(f: &Foo) -> &Bar { 
    &match *f { 
     F1 => { f.get_bar() } // Error: mismatched types: expected `Foo`, found an enum or structure pattern 
     F2 => { f.get_bar().modify_somehow(3f64) } 
    } 
} 

是否有可能匹配執行特徵Foo的結構?

回答

2

不,match不能匹配值的具體類型。考慮到match要求模式是詳盡的,並且這些特徵是開放的(來自其他模塊或其他箱子的類型可以實現你的特質),你永遠無法覆蓋所有的情況(除非你有一個簡單的變量綁定,如最後一個手臂上的x) 。 matchenum s上效果更好,它們是關閉的(該組變體在枚舉的定義中是固定的)。

你可以引入第二個特徵來做動態調度。請注意,您可以定義第二個特徵及其實現在不同的模塊中,或定義其中F1F2的不同的箱子。

trait Foo2 { 
    fn get_bar2(&self) -> &Bar; 
} 

impl Foo2 for F1 { 
    fn get_bar2(&self) -> &Bar { 
     self.get_bar() 
    } 
} 

impl Foo2 for F2 { 
    fn get_bar2(&self) -> &Bar { 
     self.get_bar().modify_somehow(3f64) 
    } 
} 

fn do_match(f: &Foo2) -> &Bar { 
    f.get_bar2() 
} 
+0

謝謝。似乎沒有辦法做我想做的事情。 – uwap 2014-09-26 03:48:11

+0

你能詳細說說你想做什麼嗎? – 2014-09-26 04:00:34

+0

我有以單位命名的tupel結構。所以米(T),釐米(T)等。他們都實施特質距離。我還有一個名爲Hour的小結,它們分別是(T),第二個(T)等等,實現了特質時間。我想定義劃分距離 /時間返回速度。現在Meter/Second應返回類型MetersPerSecond和Kilometers/Hour類型MetersPerHour等。問題是我有5個距離結構和4個時間結構(數量還是隨着時間增加),所以5 * 4 = 20個可能的組合。 – uwap 2014-09-26 04:16:37