我可以在Rust中使这个断言通用吗?

时间:2016-02-18 18:41:22

标签: generics rust traits

我试图断言一个函数在别人的箱子里返回的类型是足够大的,并且如果他们将代码更改为仍然正常的东西,就不要改变我的代码。

以下是我正在尝试做的简化版本(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 {
                     ^~~~~~

2 个答案:

答案 0 :(得分:2)

尽管未来未知的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");
}

答案 1 :(得分:0)

extern crate num;
extern crate time;

#[cfg(test)]
mod tests {
    use num::Bounded;
    use time::{self,Tm};
    #[test]
    fn size_test() {
        let NANOSECONDS_IN_DAY:f64 = 8.64E13;
        fn max_of<T:Bounded>(_: T) -> T {
            T::max_value()
        }
        let type_v = time::Duration::zero().num_nanoseconds().unwrap();
        let mv = max_of(type_v);
        assert!(mv as f64 > NANOSECONDS_IN_DAY, "type is too small");
    }
}

这很有效。