首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将u64值强制转换为通用数字类型?

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

Stack Overflow用户
提问于 2015-03-13 06:01:40
回答 1查看 1.5K关注 0票数 2

我想将一个u64值转换为一个通用的数字类型,如下所示

代码语言:javascript
复制
fn f<T: AppropriateTrait>(v: u64) -> T {
    v as T
}

并且它的行为在语义上类似于,例如259u64 as u8,也就是说,它应该只占用最不重要的位。不幸的是,FromPrimitive::from_u64函数返回一个Option<T>,如果输入值不合适,则返回None

这里起作用的是:

代码语言:javascript
复制
fn f<T: FromPrimitive + Int + ToPrimitive>(v: u64) -> T {
    T::from_u64(v & T::max_value().to_u64().unwrap()).unwrap()
}

但它非常冗长和不雅。有更好的办法吗?

编辑:我只对转换成整数类型感兴趣,如u8、u16等,没有古怪的东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-13 12:41:29

一种特别有效的方法是定义你自己的特质,并给出你想要的效果;特别是当你要做更复杂的事情时,这通常是你想要的(尽管肯定不是总是如此)。在这种情况下,您可能会选择这样的方法:

代码语言:javascript
复制
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,或者是

代码语言:javascript
复制
fn f<T: FromU64>(v: u64) -> T {
    FromU64::from_u64(T)
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29025811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档