Rust 自动派生数字类型的Add、Mul、Ord等
创建行为类似于数字的自定义类型的最简单方法是什么 我希望类型检查能够防止在程序中混合不同的单位,但我仍然希望能够轻松地对类型执行计算,而无需来回转换(类似于自定义Rust 自动派生数字类型的Add、Mul、Ord等,rust,deriving,newtype,Rust,Deriving,Newtype,创建行为类似于数字的自定义类型的最简单方法是什么 我希望类型检查能够防止在程序中混合不同的单位,但我仍然希望能够轻松地对类型执行计算,而无需来回转换(类似于自定义厘米和英寸类型) 如果我创建: struct Centimeters(f64); 然后我必须手动实现Add、Mul、Ord和许多其他特性。这是大量的样板文件,复制和粘贴此代码可能会破坏程序中的基本算法:) 不幸的是,#[derivate(Add,Sub,…)]似乎不受支持。是否还有其他标准特性/类型/板条箱可以达到类似效果?计量单位
厘米
和英寸
类型)
如果我创建:
struct Centimeters(f64);
然后我必须手动实现Add
、Mul
、Ord
和许多其他特性。这是大量的样板文件,复制和粘贴此代码可能会破坏程序中的基本算法:)
不幸的是,#[derivate(Add,Sub,…)]
似乎不受支持。是否还有其他标准特性/类型/板条箱可以达到类似效果?计量单位
你应该看看。该板条箱包含许多测量单位的定义,如厘米、英尺等
为您的新类型实现特性
现在有了一些板条箱,可以很容易地为您的新类型实现Add
,Mul
,等等
用你自己的宏
answer有一个很好的宏来帮助您实现新类型的特征。看起来所有的解决方案都使用宏,所以我建议将此添加到语言中:使用rust 1.15,您现在可以使用我的板条箱来完成此操作:您应该尝试我的板条箱,它为许多特征添加了此功能:
// This needs rust in the 2018 edition
extern crate derive_more;
use derive_more::{Add, Mul};
#[derive(Add, Mul)]
struct Centimeters(i32);
custom_derive! {
#[derive(NewtypeAdd, NewtypeMul)]
pub struct Centimeters(i32);
}