用静态函数为特征实现特征
Implement trait for trait with static function
trait Trait<T> {
fn equality() -> bool;
}
impl<T> PartialEq for Trait<T> {
fn eq(&self, other: &Trait<T>) -> bool {
self.equality()
}
}
结果
main.rs:5:23: 5:31 error: the trait `Trait` cannot be made into an object [E0372]
main.rs:5 impl<T> PartialEq for Trait<T> {
删除静态方法使其可编译。带有 &self 参数的方法也会编译。
它归结为一个称为 对象安全 的问题,您也可以在 RFC 255; Huon has a good explanation of object safety in his blog 中找到相关信息。
基本上,创建特征对象需要隐含地定义其自身特征对象的特征;在这种情况下,那将是 impl<'a, T> Trait<T> for Trait<T> + 'a
。如果可以为所有方法编写有意义的定义,那么特征就是对象安全的。静态方法在这种情况下没有意义——fn equality() -> bool
的主体是什么,没有 Self
类型来调用 equality
方法?它需要凭空提取一个布尔值,但它恭敬地拒绝这样做。
扩展 Chris 的回答,您可能想要的是 fn equality(&self) -> bool
。 fn equality() -> bool
是静态方法,也叫关联函数。它被调用为 Trait::equality()
,而不是 obj.equality()
,并且无法访问调用它的对象的字段和方法。
trait Trait<T> {
fn equality() -> bool;
}
impl<T> PartialEq for Trait<T> {
fn eq(&self, other: &Trait<T>) -> bool {
self.equality()
}
}
结果
main.rs:5:23: 5:31 error: the trait `Trait` cannot be made into an object [E0372]
main.rs:5 impl<T> PartialEq for Trait<T> {
删除静态方法使其可编译。带有 &self 参数的方法也会编译。
它归结为一个称为 对象安全 的问题,您也可以在 RFC 255; Huon has a good explanation of object safety in his blog 中找到相关信息。
基本上,创建特征对象需要隐含地定义其自身特征对象的特征;在这种情况下,那将是 impl<'a, T> Trait<T> for Trait<T> + 'a
。如果可以为所有方法编写有意义的定义,那么特征就是对象安全的。静态方法在这种情况下没有意义——fn equality() -> bool
的主体是什么,没有 Self
类型来调用 equality
方法?它需要凭空提取一个布尔值,但它恭敬地拒绝这样做。
扩展 Chris 的回答,您可能想要的是 fn equality(&self) -> bool
。 fn equality() -> bool
是静态方法,也叫关联函数。它被调用为 Trait::equality()
,而不是 obj.equality()
,并且无法访问调用它的对象的字段和方法。