2015-10-04 66 views
3

學習Rust語法我決定實現一些排序算法。所以,我決定做一個排序函數傳入數組是這樣的:。如何將實現特定特徵的對象數組傳遞給函數?

fn sort(array) { 
    // actual sorting 
} 

this question我已經發現瞭如何通過一個數組,並更改其內容,但besided這個數組必須由可以比較的類型。我發現了std::cmp::PartialOrd特徵,並發現數組中的元素需要實現它。

通過鏽書連接這方面的知識同款約dynamic dispatch我已經建立了這樣的事情:

use std::cmp; 

fn sort(arr: &mut [&std::cmp::PartialOrd]) { 
    // actual sorting 
} 

但它不會出錯編譯:

error: the type parameter `Rhs` must be explicitly specified in an object type because its default value `Self` references the type `Self` [E0393] 

是否有正確的語法來實現將實現特定特徵的對象數組傳遞給函數?

回答

6

語法在這裏並不是真正的問題。我會試着解釋爲什麼你想要做的是有點狡猾,所以你可能不會得到這個與特質對象一起工作:

你的sort函數的論點的類型爲&mut [&std::cmp::PartialOrd]。一般來說,&mut [&Trait])意味着「只要它們實現了Trait」,就是「任何類型值的可變片段」。但請注意,切片中的值可能有不同的類型。由此產生的問題是:如果切片包含不同值的值,例如在sort中應該發生什麼, FloatString?僅僅因爲浮點數可以進行比較並且可以比較字符串並不意味着你可以將浮點數與字符串進行有意義的比較。這基本上是錯誤信息指出的。

您使用的語法很好。例如,下面的(這可能是由元素的字符串表示的數組排序)編譯:

fn sort(arr: &mut [&ToString]) { 
    // sort by string representation 
} 

但你可能真正想要做的僅僅是使用一個通用的功能如下(由於動態調度沒有按」噸真的在這裏做什麼意義):

fn sort<T: PartialOrd>(arr: &mut [T]) { 
    // do the sorting 
} 

這類似於原來的代碼,但它對於任何類型的T實現PartialOrd定義sort。與代碼的重要區別在於,切片中的元素都必須是相同的類型,因此不會出現如何處理不同類型的值的問題。

+1

也許還需要注意:'&mut [&Trait]'是實現'Trait'的類型元素的一部分引用。這些元素存儲在其他地方,而不是連續的在數組中(這是不可能的,因爲數組是相同的)。排序引用數組很少是用戶想要的。 –

2

問題是函數定義。

fn sort(arr: &mut [&std::cmp::PartialOrd]) { 
    // actual sorting 
} 
如果您修改功能,包括類型參數

,你可以編譯程序

fn sort<T>(arr: &mut [T]) where T : PartialOrd{ 
} 

fn main(){} 

注: 你實際上並沒有傳遞一個數組,但一個切片。在生鏽時,數組由它保存的類型和長度來定義。

a : [i32; 10] // defines array that store `i32` and has length 10 
a : [i32] //defines slice of i32 array 

另注:

PartialOrd特質是作爲默認時,在程序編譯,所以沒有必要使用完全合格的名稱。您可以使用PartialOrd而不是std::cmp::PartialOrd。見std::prelude

相關問題