2015-08-09 39 views
3

創建類似數字的自定義類型的最簡單方法是什麼?我想要在我的程序中防止混合不同單元的類型檢查,但我仍然希望能夠輕鬆地對類型執行計算而不需要來回轉換(類似於自定義CentimetersInches類型的情況)。自動爲數值類型派生Add,Mul,Ord等

如果我創建:

struct Centimeters(f64); 

然後我必須手動執行AddMulOrd和許多其他的特徵。這是很多的樣板,並複製&粘貼此代碼會產生破壞程序中基本算術的風險:)

不幸的是#[derive(Add, Sub, …)]似乎不被支持。是否有另一種標準特質/類型/箱子可以達到類似的效果?

+0

你應該試試我的箱子,它爲許多特性添加了這個功能:https://github.com/JelteF/derive_more – JelteF

回答

5

This答案有一個很好的宏,可以幫助你爲你的新類型實現特徵。

現在有一些箱子很容易使用: custom_derivenewtype_derive
它們使你做

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

來實現你的NEWTYPE AddMul。你可以看看https://crates.io/crates/units。那個箱子可能已經允許你做你想做的事。

或者https://crates.io/crates/measurements也可能是一個很好的解決方案。

+1

它看起來像所有的解決方案使用宏,所以我建議添加到語言:https ://internals.rust-lang.org/t/deriving-for-tuple-structs/2477 – Kornel

+1

隨着生鏽1.15,你現在可以使用我的箱子來做到這一點:https://github.com/JelteF/derive_more – JelteF