2015-03-13 33 views
1

我想一個U64值轉換爲普通的數字型,有點像如何將u64值轉換爲通用數值類型?

fn f<T: AppropriateTrait>(v: u64) -> T { 
    v as T 
} 

並將其行爲語義等,例如,259u64 as u8,即,它應該只取最顯著位。不幸的是,FromPrimitive::from_u64函數返回Option<T>,如果輸入值不適合,則返回None

這這裏工作:

fn f<T: FromPrimitive + Int + ToPrimitive>(v: u64) -> T { 
    T::from_u64(v & T::max_value().to_u64().unwrap()).unwrap() 
} 

但它是非常繁瑣和不雅。有沒有更好的辦法?

編輯:我只對鑄造成像u8,u16等整數類型感興趣,沒有時髦的東西。

+0

爲什麼你想它作爲一個單獨的功能? 'v as u8'就能滿足你的要求,如果你需要它作爲函數,那麼'| v | v作爲u8'將正常工作。 – 2015-03-13 07:04:30

+0

@Chris:上面的函數當然只是我想要做的事情的本質 - 或者我應該發佈2000多行代碼?我不能寫'v as u8',因爲'u8'只是一個例子。相信我,我需要轉換爲泛型類型,而不是特定類型。 – 2015-03-13 07:44:15

+0

根據給出的要求,很難理解整個問題的目的*,爲什麼需要這個功能。多一點可能會有所幫助。 – 2015-03-13 12:42:41

回答

2

特別有效地做到這一點的一種方法是定義你自己的特質與所需的效果;特別是如果你遇到更復雜的事情,這通常會成爲你的願望(儘管絕對不總是)。對於這種情況,你可能會去這樣的事情:

trait FromU64 { 
    fn from_u64(v: u64) -> Self; 
} 

macro_rules! impl_from_u64 { 
    ($($ty:ty)*) => { 
     $(
      impl FromU64 for $ty { 
       #[inline] 
       fn from_u64(v: u64) -> $ty { 
        v as $ty 
       } 
      } 
     )* 
    } 
} 

impl_from_u64!(u8 u16 u32 u64 usize); 

你原來那麼f::<T><T as FromU64>::from_u64,或者

fn f<T: FromU64>(v: u64) -> T { 
    FromU64::from_u64(T) 
} 
+0

謝謝,這是一個非常具有代表性的解決方案! – 2015-03-13 16:26:23

相關問題