Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何将实现特定特性的对象数组传递给函数?_Arrays_Rust - Fatal编程技术网

Arrays 如何将实现特定特性的对象数组传递给函数?

Arrays 如何将实现特定特性的对象数组传递给函数?,arrays,rust,Arrays,Rust,为了学习Rust语法,我决定实现一个对传入数组进行排序的函数: fn sort(array) { // actual sorting } 在中,我了解了如何传递数组并更改其内容,但除此之外,数组必须包含可比较的类型。我已经发现了这个特性,并发现数组的元素需要实现它 通过将这些知识与铁锈书中的一段联系起来,我构建了如下内容: use std::cmp; fn sort(arr: &mut [&std::cmp::PartialOrd]) { // actual

为了学习Rust语法,我决定实现一个对传入数组进行排序的函数:

fn sort(array) {
    // actual sorting
}
在中,我了解了如何传递数组并更改其内容,但除此之外,数组必须包含可比较的类型。我已经发现了这个特性,并发现数组的元素需要实现它

通过将这些知识与铁锈书中的一段联系起来,我构建了如下内容:

use std::cmp;

fn sort(arr: &mut [&std::cmp::PartialOrd]) {
    // actual sorting
}
这不会编译:

error[E0393]:必须显式指定类型参数'Rhs'
-->src/lib.rs:3:21
|
3 | fn排序(arr:&mut[&std::cmp::PartialOrd]){
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^缺少对“Rhs”的引用`
|
=注意:由于默认的“Self”引用,必须在对象类型上指定类型参数

有没有正确的语法来实现将实现特定特征的对象数组传递给函数?

这里的语法并不是真正的问题。我将尝试解释为什么您想做的事情有点棘手,所以您可能无法使用特征对象:

sort
函数的参数具有类型
&mut[&std::cmp::PartialOrd]
。通常,
&mut[&Trait]
)表示“任何类型的值的可变部分,只要它们实现了
Trait
”。但是,请注意,切片中的值可能有不同的类型。由此产生的问题是:如果切片包含不同值的值,例如
Float
String
,那么
排序中应该发生什么?仅仅因为可以比较Float和String,并不意味着可以进行有意义的比较比较一个浮点数和一个字符串。这基本上就是错误消息所指出的

您使用的语法很好。例如,以下代码(可能按元素的字符串表示形式对数组进行排序)编译:

fn sort(arr: &mut [&ToString]) {
    // sort by string representation
}
但实际上,您可能只想使用一个通用函数,如下所示(因为动态分派在这里没有多大意义):

fn排序(arr:&mut[T]){
//分类
}

这与原始代码类似,但它为实现
PartialOrd
的任何类型
T
定义了
sort
。代码的重要区别在于切片中的元素都必须是相同的类型,因此不会出现如何处理不同类型的值的问题。

问题是函数n定义

fn sort(arr: &mut [&std::cmp::PartialOrd]) {
    // actual sorting
}
如果修改函数以包含类型参数,则可以编译程序:

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

fn main() {}

还请注意,编译程序时默认包括
PartialOrd
特征,因此不需要使用完全限定名。您可以使用
PartialOrd
而不是
std::cmp::PartialOrd
。请参阅。

可能还需要注意:
&mut[&trait]
是对实现
Trait
类型的元素的引用片段。元素存储在其他地方,而不是在数组中连续存储(这是不可能的,因为数组是同质的)。对引用数组排序很少是用户想要的。
fn sort<T>(arr: &mut [T])
where
    T: PartialOrd,
{
}

fn main() {}
a: [i32; 10] // defines an array that stores `i32` and has length 10
a: [i32] // defines a slice of i32