簡體   English   中英

如何在不重復的情況下以相同的方式為多種類型實現特征?

[英]How to implement a trait in the same way for many types without repetition?

鑒於一個特征,我們可能希望為許多類型實現它。

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參考

實現是實現特定類型的特征的項。

看一下文檔ZeroOne的實現(自Rust 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 }

如果標准文檔用宏做了,我懷疑是否存在更好的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM