为了学习Rust语法,我决定实现一个对传入数组进行排序的函数:
fn sort(array) {
// actual sorting
}
Run Code Online (Sandbox Code Playgroud)
在这个问题中,我发现了如何传递数组并更改其内容,但除此之外,数组必须包含可以比较的类型.我找到了这个std::cmp::PartialOrd
特性,并发现数组的元素需要实现它.
通过将这些知识与Rust书中关于动态调度的段落联系起来,我构建了这样的东西:
use std::cmp;
fn sort(arr: &mut [&std::cmp::PartialOrd]) {
// actual sorting
}
Run Code Online (Sandbox Code Playgroud)
这不编译:
error[E0393]: the type parameter `Rhs` must be explicitly specified
--> src/lib.rs:3:21
|
3 | fn sort(arr: &mut [&std::cmp::PartialOrd]) {
| ^^^^^^^^^^^^^^^^^^^^ missing reference to `Rhs`
|
= note: because of the default `Self` reference, type parameters must be specified on object types
Run Code Online (Sandbox Code Playgroud)
是否有正确的语法来实现将实现特定特征的对象数组传递给函数?
语法在这里不是问题.我会试着解释为什么你想要做的有点狡猾,所以你可能不会让它与trait对象一起工作:
sort
函数的参数具有类型&mut [&std::cmp::PartialOrd]
.一般而言,&mut [&Trait]
)表示"任何类型的可变片段,只要它们实现Trait
".但请注意,切片中的值可能具有不同的类型.由此产生的问题是:sort
如果切片包含不同值的值,会发生什么,例如Float
和String
?只是因为可以比较浮点数并且可以比较字符串并不意味着您可以有意义地将浮点数与字符串进行比较.这基本上是错误消息指出的内容.
你正在使用的语法很好.例如,以下(可能通过元素的字符串表示形式对数组进行排序)编译:
fn sort(arr: &mut [&ToString]) {
// sort by string representation
}
Run Code Online (Sandbox Code Playgroud)
但你可能真正想做的只是使用如下的通用函数(因为动态调度在这里没有多大意义):
fn sort<T: PartialOrd>(arr: &mut [T]) {
// do the sorting
}
Run Code Online (Sandbox Code Playgroud)
这与您的原始代码类似,但它定义sort
了任何T
实现的类型PartialOrd
.与代码的重要区别在于切片中的元素都必须属于同一类型,因此不会出现如何处理不同类型的值的问题.
归档时间: |
|
查看次数: |
899 次 |
最近记录: |