gpt4 book ai didi

rust - 为什么允许使用 `as` 而不是 `From` 从 u64 到 usize 的类型转换?

转载 作者:行者123 更新时间:2023-11-29 07:42:27 28 4
gpt4 key购买 nike

第一个使用“as”的转换编译,但第二个使用“From”特性的转换不编译:

fn main() {
let a: u64 = 5;
let b = a as usize;
let b = usize::from(a);
}

使用 Rust 1.34.0,出现以下错误:

error[E0277]: the trait bound `usize: std::convert::From<u64>` is not satisfied
--> src/main.rs:4:13
|
4 | let b = usize::from(a);
| ^^^^^^^^^^^ the trait `std::convert::From<u64>` is not implemented for `usize`
|
= help: the following implementations were found:
<usize as std::convert::From<bool>>
<usize as std::convert::From<std::num::NonZeroUsize>>
<usize as std::convert::From<u16>>
<usize as std::convert::From<u8>>
= note: required by `std::convert::From::from`

当我用 u8 替换 u64 时,不再有错误。从错误消息中,我了解到 From 特性仅针对 u8 实现,但未针对其他整数类型实现。

如果有充分的理由,那么为什么使用 'as' 的转换也不应该编译失败?

最佳答案

as转换与 From 根本不同转换。 From转换“简单并且安全”,而 as类型转换纯粹是“安全的”。在考虑数字类型时,From只有当输出保证相同时,转换才存在,即没有信息丢失(没有截断或地板或精度损失)。 as但是,强制转换没有此限制。

引用文档,

The size of [usize] is "how many bytes it takes to reference any location in memory. For example, on a 32 bit target, this is 4 bytes and on a 64 bit target, this is 8 bytes."

由于大小取决于目标体系结构并且无法在编译前确定,因此无法保证 From数字类型和 usize 之间的转换是可能的。一个as然而,cast 将始终按照列出的规则运作 here .

例如,在 32 位系统上,usize相当于u32 .自usize小于 u64 , 转换 u64 时可能会丢失信息(截断)进入 usize因此 From转换不存在。但是,usize 的大小始终保证为 8 位或更高,并且 u8usize From转换将永远存在。

关于rust - 为什么允许使用 `as` 而不是 `From` 从 u64 到 usize 的类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47786322/

28 4 0