首页 文章

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

提问于
浏览
1
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参数编译的方法也是如此 .

2 回答

  • 0

    它归结为一个称为对象安全的问题,你可以在_983086中找到它的信息; Huon也有a good explanation of object safety in his blog .

    基本上,制作特征对象需要为其自己的特征对象隐含的特征定义;在这种情况下,那将是 impl<'a, T> Trait<T> for Trait<T> + 'a . 如果可以写出所有方法的有意义的定义,那么特征是对象安全的 . 静态方法在这种情况下没有意义 - fn equality() -> bool 的主体是什么,没有 Self 类型来调用 equality 方法?它需要从空气中拉出一个布尔值,它恭敬地拒绝这样做 .

  • 4

    扩展克里斯的回答,你可能想要的是 fn equality(&self) -> bool . fn equality() -> bool 是一种静态方法,也称为关联函数 . 它被称为 Trait::equality() ,而不是 obj.equality() ,并且无法访问调用它的对象的字段和方法 .

相关问题