使用静态函数

时间:2015-05-14 13:25:42

标签: rust

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> {

删除静态方法使其可编译。使用&amp; self参数编译的方法。

2 个答案:

答案 0 :(得分:4)

归结为一个称为对象安全的问题,您可以在RFC 255找到相关信息; Huon也有a good explanation of object safety in his blog

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

答案 1 :(得分:0)

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