2016-11-03 70 views
1

我想要一個包含諸如Eq等特徵的元素的向量,我需要異構向量。例如:是否有可能具有實現Eq的類型的異構向量?

let mut x: Vec<Eq> = Vec::new(); 

x.push(1); 
x.push("hello") 

我得到那個說Eq不能做成一個對象的錯誤消息:

error[E0038]: the trait `std::cmp::Eq` cannot be made into an object 
--> src/main.rs:2:20 
    | 
2 |  let mut x: Vec<Eq> = Vec::new(); 
    |     ^^ the trait `std::cmp::Eq` cannot be made into an object 
    | 
    = note: the trait cannot use `Self` as a type parameter in the supertrait listing 

是否有可能有一個指針來的東西我可以比較列表,不論其類型?

+1

如果你樂於使用'Any'特質,而不是'Eq'具體而言,'VEC (作品鏈接)(https://play.rust-lang.org/?gist=22fcc82ccea3f0b0aa0f3528f23d35a6&version=stable&backtrace=0))。 – Aurora0001

+0

謝謝,但我真的需要能夠比較向量中的東西。 特別是,更大的問題是,我想有一個帶有異構鍵的HashMap。 – FCo

回答

6

是否有可能有指針的列表指向我可以比較的事物,而不管它們的類型如何?

這沒有意義。你如何「比較」StringFileSocketGuiWindowFontFamily

該代碼也有一些小問題,即它沒有任何種類的特質間接。請參閱What is the best way to create a heterogeneous collection of objects?,以便在不與物體安全作鬥爭的情況下如何製作異構載體。

說到對象安全,there's a great blog series on the subject,其中涵蓋了你所得到的具體錯誤的細節。

那麼,我們該怎麼辦?對於初學者來說,我們可以更具體:

let mut x: Vec<Box<PartialEq<u8>>> = Vec::new(); 

這工作,因爲我們是在說,一切都在矢量可以比作一個u8,而且也沒有可能性的開放式的無限數量的每一個都可以被比較至。

你也可以實現一些特質是決定事情應該怎樣去比較,然後使用:

trait Silly { 
    fn silly(&self) -> usize; 
} 

impl Silly for u8 { 
    fn silly(&self) -> usize { *self as usize } 
} 

impl Silly for bool { 
    fn silly(&self) -> usize { 1 } 
} 

fn main() { 
    let mut x: Vec<Box<Silly>> = Vec::new(); 
} 
+0

謝謝。比較不同類型的事物非常簡單,不同類型的值總是不同的,但是相同類型的值可以相等。 在我的情況下,我試圖實現的是一個n元樹,其中每個級別都有不同類型的鍵,所以我需要泛型類型參數具有一般性,並且我完全需要Eq和Hash。 – FCo

+2

@FCo我們說什麼主要類型?你不能把它們包裹在一個枚舉中嗎? –

+2

枚舉是一個很好的解決方案,IMO。然後由數據結構的用戶根據需要實施「Eq」。 – Shepmaster

相關問題