[英]Rust: How to return a generic trait within a trait method, where the generic type is different?
[英]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.