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;休恩有他的博客中对对象安全有很好的解释, too.
基本上,创建一个特征对象需要为其自己的特征对象隐式定义该特征;在这种情况下,那就是impl<'a, T> Trait<T> for Trait<T> + 'a
。如果可以为所有方法编写有意义的定义,那么特征就是对象安全的。静态方法在这种情况下没有意义——其主体是什么?fn equality() -> bool
是,没有Self
键入周围来调用equality
方法上?它需要凭空提取一个布尔值,但它恭敬地拒绝这样做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)