![](/img/trans.png)
[英]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.