【问题标题】:Is there some way to implement the Add trait for any type bounded by a trait?是否有某种方法可以为任何受 trait 限制的类型实现 Add trait?
【发布时间】:2018-06-24 15:08:49
【问题描述】:

我正在阅读"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 实现了这个):

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

有没有办法编写一个更通用的Add trait,看起来像这样(这是无效的):

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))
    }
} 

【问题讨论】:

    标签: rust traits


    【解决方案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))
        }
    }
    

    不过我会使用Intowhere 子句:

    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))
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 2017-10-12
      相关资源
      最近更新 更多