自动转发操作,同时保留结果

时间:2018-11-10 00:57:38

标签: rust

我正在尝试为角度,质量,速度等物理量度创建一个不错的界面。我希望它们在编译时提供尺寸分析检查,理想情况下运行时开销为零。我认为Rust可能非常适合此操作,尤其是在特质方面。

到目前为止,我所拥有的看起来像这样:

pub trait Measure {
    type Underlying: Clone; // the underlying storage type (most often a Float)

    fn name() -> &'static str;
    fn default_unit() -> &'static str;
    fn in_default_unit(&self) -> Self::Underlying;
    fn from_default_unit(m: Self::Underlying) -> Self;
}

,实现将类似于:

#[derive(Debug, Clone, PartialEq)]
pub struct Angle<'a> {
    radians: Float, // dynamic but either a `f64` or `f32`
}

impl<'a> Angle<'a> {
    fn from_radians(radians: Float) -> Self {
        Self { radians }
    }
}

impl<'a> Measure<'a> for Angle<'a> {
    type Underlying = Float;

    fn name() -> &'static str {
        "angle"
    }

    fn default_unit() -> &'static str {
        "radian"
    }

    fn in_default_unit(&self) -> Self::Underlying {
        self.radians
    }

    fn from_default_unit(m: Self::Underlying) -> Self {
        Self::from_radians(m)
    }
}

我想添加诸如重载+运算符之类的常用操作,但我想以与Measure特性相关联的方式来执行此操作,因此我不必创建每Measure都使用它。

我尝试为Angle可以Deref进行操作的中间类,但是遇到了生命周期方面的一些问题,我认为这条路线实际上是不可能的。

在我看来,这似乎是解决问题的普遍需求。我该怎么办?

1 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点,主要涉及宏或过程宏。该方法实际上在one of Shepmaster's answers中有很好的描述,但是我要采用的路线可能会使用derive_more板条箱,这将使我能够非常轻松地提供这些便捷功能。

那我就可以

#[macro_use]
extern crate derive_more;

#[derive(Add)]
struct Angle {
    radians: Float,
}