与具体实现类型相比,使用关联类型是否有任何优势?

时间:2017-12-27 06:19:43

标签: rust

在此代码中使用Self::Output优于Int256作为返回类型是否有任何优势?

impl Add for Int256 {
    type Output = Int256;

    fn add(self, v: Int256) -> Self::Output {
        // ...
    }
}

impl Add for Int256 {
    type Output = Int256;

    fn add(self, v: Int256) -> Int256 {
        // ...
    }
}

1 个答案:

答案 0 :(得分:1)

从编译器的角度来看,两个签名之间没有区别,因此决定哪个更适合人类阅读和理解代码。

我通常更喜欢使用关联类型而不是具体类型。

这出现在Iterator特征的实现中。假设我们有一个暴露迭代器而不是布尔值的类型。

impl Iterator for MyBits {
    type Item = bool;

    fn next(&mut self) -> ??? {
        /* ... */
    }
}

对于???,我们可以放置Option<Self::Item>Option<bool>。快速浏览此代码的人将更容易阅读Option<Self::Item>,因为它更好地捕获了返回类型的含义 - 迭代中的下一个项目(如果有的话)。如果我们写Option<bool>那么意义不那么明显 - 也许bool以某种方式表明是否还有剩余的项目......?