2016-10-24 9 views
3

形質を考えれば、多くの種類のためにそれを実装したいかもしれません。反復せずに多くの型に対して同じ方法で特性を実装する方法は?

pub trait RTypeUnit { 
    fn zero() -> Self; 
    fn one() -> Self; 
} 

impl RTypeUnit for usize { fn zero() -> usize { 0 } fn one() -> usize { 1 } } 
impl RTypeUnit for isize { fn zero() -> isize { 0 } fn one() -> isize { 1 } } 
impl RTypeUnit for u64 { fn zero() -> u64 { 0 } fn one() -> u64 { 1 } } 
impl RTypeUnit for i64 { fn zero() -> i64 { 0 } fn one() -> i64 { 1 } } 
impl RTypeUnit for u32 { fn zero() -> u32 { 0 } fn one() -> u32 { 1 } } 
impl RTypeUnit for i32 { fn zero() -> i32 { 0 } fn one() -> i32 { 1 } } 
impl RTypeUnit for u16 { fn zero() -> u16 { 0 } fn one() -> u16 { 1 } } 
impl RTypeUnit for i16 { fn zero() -> i16 { 0 } fn one() -> i16 { 1 } } 
impl RTypeUnit for u8 { fn zero() -> u8 { 0 } fn one() -> u8 { 1 } } 
impl RTypeUnit for i8 { fn zero() -> i8 { 0 } fn one() -> i8 { 1 } } 

各タイプの関数の書き出しを避けるための慣習的な方法は何ですか?私はデフォルトの実装、あるいはマクロを使うべきですか?

これらの具体的な方法については、numクレートについて知っていますが、一般的なケースでこれを行う方法を知りたいと思います。 Rust reference 1として

答えて

8

実装は、特定のタイプの形質を実装する項目です。

docsZeroOneの実装を見てみましょう(錆1.11以降、非推奨、私は非推奨は簡潔にするため属性を削除):

pub trait Zero: Sized { 
    fn zero() -> Self; 
} 

pub trait One: Sized { 
    fn one() -> Self; 
} 

macro_rules! zero_one_impl { 
    ($($t:ty)*) => ($(
     impl Zero for $t { 
      #[inline] 
      fn zero() -> Self { 0 } 
     } 
     impl One for $t { 
      #[inline] 
      fn one() -> Self { 1 } 
     } 
    )*) 
} 
zero_one_impl! { u8 u16 u32 u64 usize i8 i16 i32 i64 isize } 

標準ドキュメントはマクロでそれをやった場合は、私はより良い方法が存在するのではないかと疑う。

+0

これは型推論のためにのみ機能することに注意してください。 '0'と' 1'は 'u8'または' u32'または 'i64'を意味します。ほとんどの場合、必要な具体的な価値を説明する必要があります。 – Shepmaster

関連する問題