我希望能夠創建一個函式,我可以呼叫 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"
uj5u.com熱心網友回復:
實作一個方法dyn Trait幾乎從來都不是你想要的。它不會為所有實作 trait 的型別實作該方法,而是在 trait 本身上實作。
通常你需要一個全面的實作(impl<F: Float> EqWithEpsilon for F),但在這種情況下它不會作業。您需要一個對兩者都通用的特征Complex并且浮動。你可以自己寫:
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
}
如果您使用 0.4.2 的最新版本num_traits(在撰寫本文時,它甚至還沒有發布到操場上),您可以使用 ready trait:ComplexFloat.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/494517.html
