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

标签 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 等,没有什么时髦的东西。

最佳答案

特别有效地做到这一点的一种方法是定义自己的特质并达到预期的效果;特别是如果您要处理更复杂的事情,这通常就是您想要的(尽管绝对不总是)。对于这种情况,您可能会选择这样的方法:

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

关于rust - 如何将 u64 值转换为通用数字类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29025811/

相关文章:

rust - 当第二个参数用'a注释时,第一个参数的隐式生存期是多少?

rust - 有没有办法让 clap 覆盖 [ -h | --help ] 标记帮助文本?

rust - 为什么即使我已经实现了 Trait<&str>,特征绑定(bind) Trait<&String> 仍然不满足?

rust - 如果Rust项目已更新,请重新运行规则

rust - 将选项或结果向量转换为仅成功值时,如何避免展开?

rust - 从 Option<String> 转换为非空 &str 不移动

rust - 为什么 `Item` 迭代器的 `Char` 是通过在字符串切片上调用 `chars` 而获得的,而不是对 `char` 的引用?

rust - 我们是否需要为链表手动创建析构函数?

rust - 拥有兄弟领域和生命周期

rust - 派生特征会导致意外的编译器错误,但手动实现有效