用静态函数为特征实现特征

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) -> boolfn equality() -> bool是静态方法,也叫关联函数。它被调用为 Trait::equality(),而不是 obj.equality(),并且无法访问调用它的对象的字段和方法。