如何将u64值转换为通用数字类型?

时间:2015-03-13 06:01:40

标签: rust

我想将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等整数类型感兴趣,没有时髦的东西。

1 个答案:

答案 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)
}