我想将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 :(得分: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)
}