自动推导出一个数值类型的Add、Mul、Ord等

Automatically derive Add, Mul, Ord, etc. for a numeric type

创建行为类似于数字的自定义类型的最简单方法是什么?

我想要类型检查以防止在我的程序中混合不同的单位,但我仍然希望能够轻松地对类型执行计算而无需来回转换(类似于自定义 CentimetersInches 类型)。

如果我创建:

struct Centimeters(f64);

然后我必须手动实现 AddMulOrd 和许多其他特征。这是很多样板文件,复制和粘贴这段代码会产生破坏程序中基本算法的风险:)

不幸的是 #[derive(Add, Sub, …)] 似乎不受支持。有没有其他标准trait/type/crate可以达到类似的效果?

测量单位

你应该看看 https://crates.io/crates/measurements。该箱子包含许多测量单位的定义,例如厘米、英尺等。

为你的新类型实现特征

现在有一些 crate 可以非常容易地为您的新类型实施 AddMul 等。

derive_more

// This needs rust in the 2018 edition
extern crate derive_more;
use derive_more::{Add, Mul};

#[derive(Add, Mul)]
struct Centimeters(i32);

newtype_derive

custom_derive! {
  #[derive(NewtypeAdd, NewtypeMul)]
  pub struct Centimeters(i32);
}

具有您自己的宏的特征

This 答案有一个很好的宏来帮助你为你的新类型实现特征。