我想将 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/