繁体   English   中英

用静态功能实现特质

[英]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 在他的博客中也很好地解释了对象安全性

基本上,制作特征对象需要为其自身的特征对象隐含定义特征。 在这种情况下, impl<'a, T> Trait<T> for Trait<T> + 'a来说,应为impl<'a, T> Trait<T> for Trait<T> + 'a 如果可以编写所有方法的有意义的定义,则特征是对象安全的。 在这种情况下,静态方法没有意义fn equality() -> bool的主体将是什么,而周围没有Self类型可以调用equality方法? 它需要从布尔中抽出一个布尔值,但是它拒绝这样做。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM