【发布时间】:2021-05-08 07:42:07
【问题描述】:
在rust lang book 的第 10 章中有一个静态调度示例,如下所示:
fn largest<T: PartialOrd + Copy>(list: &[T]) -> T {
let mut largest = list[0];
for &i in list {
if i > largest {
largest = i;
}
}
largest
}
我正在尝试使用动态调度 as described in chapter 17 重新实现相同的示例。迄今为止我最好的尝试:
fn largest_dyn(list: &[Box<dyn PartialOrd<i32>>]) -> Box<dyn PartialOrd<i32>> {
let mut largest = &list[0];
for &i in list {
if *i > **largest {
**largest = *i;
}
}
**largest
}
但这不能编译。我得到的错误是:
expected `i32`, found trait object `dyn PartialOrd`
我有很多问题希望有人能提供帮助:
- 为什么上面没有编译?似乎我取消引用左侧和右侧的次数相同,但一个是
i32,另一个是dyn trait object? - 编译器强迫我将
<i32>放在dyn PartialOrd之后,以达到这一点。我不明白 - 特征对象的目的不是特别是它们不需要您指定类型,而只需要指定特征吗?为什么我要在这里输入类型? - 原来的函数实际上实现了两个特征:
PartialOrd和Copy。我找不到使用Box<>的方法 -Box<dyn PartialOrd + dyn Copy>似乎不起作用。有没有办法同时为多个特征创建一个特征对象?
【问题讨论】:
标签: rust