有什么方法可以为以特征为界的任何类型实现添加特征?

时间:2018-06-24 15:08:50

标签: rust traits

我正在阅读"Advanced Traits" section of the Rust book,那里有一个添加两个不同类型的示例:

use std::ops::Add;

struct Millimeters(u32);
struct Meters(u32);

impl Add<Meters> for Millimeters {
    type Output = Millimeters;

    fn add(self, other: Meters) -> Millimeters {
        Millimeters(self.0 + (other.0 * 1000))
    }
}

假设我具有MillimetersMeters都实现的特征,该特征指定如何将自己变成仪表(并假设MillimetersMeters实现了这一特征): / p>

trait Length {
    fn to_meters(&self) -> Meters;
}

有没有办法写出更通用的Add特征,看起来像这样(无效):

impl Add<T: Length> for Millimeters {
    type Output = Meters;

    fn add(&self, other: &T) -> Meters {
        let as_meters = other.to_meters();
        Meters((self.0 / 1000) + (as_meters.0))
    }
} 

1 个答案:

答案 0 :(得分:1)

是的,除了您莫名其妙地将特征绑定放在错误的位置,并将函数签名更改为引用而不是值。使其起作用的修复方法:

impl<T: Length> Add<T> for Millimeters {
    type Output = Meters;

    fn add(self, other: T) -> Meters {
        let as_meters = other.to_meters();
        Meters((self.0 / 1000) + (as_meters.0))
    }
}

我会使用Into和一个where子句:

impl<T> Add<T> for Millimeters
where
    T: Into<Meters>,
{
    type Output = Meters;

    fn add(self, other: T) -> Meters {
        let as_meters = other.into();
        Meters((self.0 / 1000) + (as_meters.0))
    }
}