簡體   English   中英

Rust:Nums 的通用 'within epsilon' 特征

[英]Rust: Generic 'within epsilon' trait for Nums

我希望能夠創建一個函數,我可以調用 Floats 或 Complex 類型,當它們彼此相距指定距離時返回 true。

這是我得到的最接近的,當然不包括 Compelx 數字:

fn eq_within_epsilon<F: Float>(a: F, b:F, eps: F) -> bool {
    F::abs(a - b) < eps
}

我試圖像這樣擴展定義,以涵蓋所有Num

trait EqWithinEpsilon {
    fn eq_within_epsilon<T: Num>(a: T, b:T, eps: T) -> bool;
}

impl EqWithinEpsilon for dyn Float {
    fn eq_within_epsilon<T: Num>(a: T, b: T, eps: T) -> bool {
        T::abs(a - b) < eps
    }
}

但我得到了錯誤:

the trait cannot be made into an object because it uses `Self` as a type parameter

有什么辦法可以做到這一點。

以防萬一,我正在使用以下板條箱:

num-complex = "0.4.0"
num-traits = "0.2.15"

dyn Trait實現一個方法幾乎不是你想要的。 它不會為所有實現 trait 的類型實現該方法,而是在 trait 本身上實現。

通常你需要一個全面的實現( impl<F: Float> EqWithEpsilon for F ),但在這種情況下它不起作用。 您需要一個對Complex和 float 都通用的特征。 你可以自己寫:

trait ComplexFloat: Num {
    type Real: Float;
    fn abs(self) -> Self::Real;
}

// We cannot use a blanket implementation because of coherence.
impl ComplexFloat for f32 {
    type Real = Self;
    fn abs(self) -> Self::Real { self.abs() }
}
impl ComplexFloat for f64 {
    type Real = Self;
    fn abs(self) -> Self::Real { self.abs() }
}

impl<F: Float> ComplexFloat for Complex<F> {
    type Real = F;
    fn abs(self) -> Self::Real { self.norm() }
}

fn eq_within_epsilon<F: ComplexFloat>(a: F, b: F, eps: F::Real) -> bool {
    F::abs(a - b) < eps
}

如果您使用num_traits的最新版本 0.4.2(在撰寫本文時,它甚至還沒有發布到操場上),您可以使用現成的 trait: ComplexFloat

暫無
暫無

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

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