注:此问题来自 Rust 1.0 之前的版本,并引用了一些在 Rust 1.0 中不存在的项目。答案仍包含有价值的信息。
什么是将(例如)usize 转换为 u32 的惯用方式?
例如,使用“4294967295us as u32”进行强制转换可以工作,Rust 0.12参考文档中关于类型转换的内容如下:
数字值可以转换为任何数字类型。原始指针值可以转换为任何整数类型或原始指针类型。任何其他转换都不受支持并将无法编译。
但是,“4294967296us as u32”将会悄悄地溢出并给出0的结果。
我发现了
什么是将(例如)usize 转换为 u32 的惯用方式?
例如,使用“4294967295us as u32”进行强制转换可以工作,Rust 0.12参考文档中关于类型转换的内容如下:
数字值可以转换为任何数字类型。原始指针值可以转换为任何整数类型或原始指针类型。任何其他转换都不受支持并将无法编译。
但是,“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
时要小心 - 它们可以表示的数字范围取决于平台你正在编译的!你的示例可能更好地使用u64
表达。 - Shepmaster