【发布时间】:2016-05-31 02:40:18
【问题描述】:
我正在尝试断言,其他人的 crate 中的函数返回的类型足够大,如果他们将代码更改为仍然可以的代码,我不想更改我的代码。
这是我正在尝试做的事情的简化版本 (playground):
const NANOSECONDS_IN_DAY:f64 = 8.64E13;
trait HasMax<T> {
fn max_value() -> T;
}
fn max_of<T:HasMax>(_: &T) -> T {
T::max_value()
}
fn main() {
let mv = max_of(&1f64);
assert!(mv > NANOSECONDS_IN_DAY, "type is too small");
}
但是我收到以下错误:
<anon>:5:13: 5:19 error: wrong number of type arguments: expected 1, found 0 [E0243]
<anon>:5 fn max_of<T:HasMax>(_: &T) -> T {
^~~~~~
【问题讨论】:
-
如果我们假设另一个 crate 从
f64切换到u64,即使示例代码已编译,它也会尝试将u64与f64进行比较,这不起作用。除此之外,可能其他 crate 不知道HasMax,因此本地 crate 必须为各种类型实现它,这意味着如果类型发生更改,本地代码必须添加新实现。我错过了什么吗? -
也许我遗漏了一些关于特征的东西,另一个板条箱现在返回一个 i64,(我忘记在我的示例代码中转换以处理
>不工作)和 i64(和其他原始数字类型)实现::max_value。所以我认为这应该可行。 -
原始数字类型实现
max_value— 当 API 更改为返回struct Time(u64, u64)时,您希望发生什么? -
那么它不会编译,但是虽然它仍然是一个原始的数字类型并且说类型继续实现 max_value 设置和忘记它会很好。即使它不完美,它也能让我长寿。