【发布时间】:2015-04-01 03:06:10
【问题描述】:
编者注:这个问题来自 Rust 1.0 之前的版本,并引用了 Rust 1.0 中不存在的一些项目。答案仍然包含有价值的信息。
从(比如)usize 转换为u32 的惯用方式是什么?
例如,使用4294967295us as u32 进行强制转换有效,而Rust 0.12 reference docs on type casting 则说
数值可以转换为任何数值类型。原始指针值可以转换为或从任何整数类型或原始指针类型转换。不支持任何其他类型转换,并且将无法编译。
但4294967296us as u32 会静默溢出并给出结果 0。
我发现ToPrimitive 和FromPrimitive 提供了像to_u32() -> Option<u32> 这样的好功能,但它们被标记为不稳定:
#[unstable(feature = "core", reason = "trait is likely to be removed")]
在数字(和指针)类型之间转换的惯用(和安全)方法是什么?
isize / usize 的平台依赖大小是我问这个问题的一个原因 - 最初的场景是我想从 u32 转换为 usize 所以我可以代表一棵树一个Vec<u32>(例如let t = Vec![0u32, 0u32, 1u32],那么要获得节点2的祖父母将是t[t[2us] as usize]),我想知道如果usize小于32位,它将如何失败。
【问题讨论】:
-
小心使用
isize/usize- 它们可以代表您正在编译的changes based on the platform 的数字范围!改用u64可能会更好地表达您的示例。