【问题标题】:Implement trait for trait with static function使用静态函数实现 trait 的 trait
【发布时间】:2015-05-14 13:25:41
【问题描述】:
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 参数的方法也可以编译。

【问题讨论】:

    标签: rust


    【解决方案1】:

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

    基本上,制作一个 trait 对象需要为它自己的 trait 对象隐含定义该 trait;在这种情况下,那将是impl&lt;'a, T&gt; Trait&lt;T&gt; for Trait&lt;T&gt; + 'a。如果可以为所有方法编写有意义的定义,那么 trait 就是对象安全的。静态方法在这种情况下没有意义——fn equality() -&gt; bool 的主体会是什么,没有 Self 类型来调用 equality 方法?它需要凭空提取一个布尔值,但它恭敬地拒绝这样做。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,我已经知道了。静态方法最初被称为new,所以需要静态性。
      猜你喜欢
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多