我正在尝试为角度,质量,速度等物理量度创建一个不错的界面。我希望它们在编译时提供尺寸分析检查,理想情况下运行时开销为零。我认为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
进行操作的中间类,但是遇到了生命周期方面的一些问题,我认为这条路线实际上是不可能的。
在我看来,这似乎是解决问题的普遍需求。我该怎么办?
答案 0 :(得分:0)
有很多方法可以做到这一点,主要涉及宏或过程宏。该方法实际上在one of Shepmaster's answers中有很好的描述,但是我要采用的路线可能会使用derive_more板条箱,这将使我能够非常轻松地提供这些便捷功能。
那我就可以
#[macro_use]
extern crate derive_more;
#[derive(Add)]
struct Angle {
radians: Float,
}