【发布时间】:2015-03-13 21:06:25
【问题描述】:
我想将 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 等整数类型感兴趣,没有什么时髦的东西。
【问题讨论】:
-
为什么要将它作为一个单独的函数?
v as u8可以满足您的需求,如果您需要它作为函数,那么|v| v as u8可以正常工作。 -
@Chris:上面的函数当然只是我想做的事情的本质——或者我应该发布2000+行代码吗?我不能写
v as u8因为u8只是一个例子。相信我,我需要转换为泛型类型,而不是特定类型。 -
根据给定的请求,很难理解整个问题的目的,为什么需要这个函数。多一点可能会有所帮助。
-
我的问题的确切上下文超出了问题的范围,并且不是真正需要的解决方案。但如果您有兴趣:我开发用于形式验证的软件并希望使用查找表来模拟布尔函数。为此,我有一个包含 6 个 u64 值的模板,这些值必须被截断为相应数量的布尔输入所需的长度(例如,u16 用于 4 个输入)。
标签: rust