我试图断言别人的 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 {
                     ^~~~~~

最佳答案

尽管将来使用的库中的API发生未知更改,但仍然试图使您的代码正常工作,这种做法充其量是错误的。简短的答案是,如果您正在使用的库的API发生更改,则最好是代码无法编译,而不是以某种更微妙或难以检测的方式失败。但是我可以回答为什么您的代码无法编译。

问题出在使用泛型的特征定义中。您的特征应该是HasMax,而不是HasMax<T>

const NANOSECONDS_IN_DAY:f64 = 8.64E13;
trait HasMax {
    fn max_value() -> Self;
}
fn max_of<T:HasMax>(_: &T) -> T {
    T::max_value()
}
impl HasMax for f64 {
    fn max_value() -> Self {
        std::f64::MAX
    }
}
fn main() {
    let mv = max_of(&1f64);
    assert!(mv > NANOSECONDS_IN_DAY, "type is too small");
}

关于generics - 我可以在Rust中使该断言通用吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35489806/

10-10 22:35