簡體   English   中英

我可以在Rust中使該斷言通用嗎?

[英]Can I make this assertion generic in Rust?

我試圖斷言某個人的板條箱中的函數返回的類型足夠大,並且如果他們將代碼更改為尚可的情況,則不想更改我的代碼。

這是我要做的事情的簡化版本( 操場 ):

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");
}
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");
    }
}

這可行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM