自动推导出一个数值类型的Add、Mul、Ord等
Automatically derive Add, Mul, Ord, etc. for a numeric type
创建行为类似于数字的自定义类型的最简单方法是什么?
我想要类型检查以防止在我的程序中混合不同的单位,但我仍然希望能够轻松地对类型执行计算而无需来回转换(类似于自定义 Centimeters
和 Inches
类型)。
如果我创建:
struct Centimeters(f64);
然后我必须手动实现 Add
、Mul
、Ord
和许多其他特征。这是很多样板文件,复制和粘贴这段代码会产生破坏程序中基本算法的风险:)
不幸的是 #[derive(Add, Sub, …)]
似乎不受支持。有没有其他标准trait/type/crate可以达到类似的效果?
测量单位
你应该看看 https://crates.io/crates/measurements。该箱子包含许多测量单位的定义,例如厘米、英尺等。
为你的新类型实现特征
现在有一些 crate 可以非常容易地为您的新类型实施 Add
、Mul
等。
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 答案有一个很好的宏来帮助你为你的新类型实现特征。
创建行为类似于数字的自定义类型的最简单方法是什么?
我想要类型检查以防止在我的程序中混合不同的单位,但我仍然希望能够轻松地对类型执行计算而无需来回转换(类似于自定义 Centimeters
和 Inches
类型)。
如果我创建:
struct Centimeters(f64);
然后我必须手动实现 Add
、Mul
、Ord
和许多其他特征。这是很多样板文件,复制和粘贴这段代码会产生破坏程序中基本算法的风险:)
不幸的是 #[derive(Add, Sub, …)]
似乎不受支持。有没有其他标准trait/type/crate可以达到类似的效果?
测量单位
你应该看看 https://crates.io/crates/measurements。该箱子包含许多测量单位的定义,例如厘米、英尺等。
为你的新类型实现特征
现在有一些 crate 可以非常容易地为您的新类型实施 Add
、Mul
等。
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 答案有一个很好的宏来帮助你为你的新类型实现特征。