2015-10-04 84 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

相关问题