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