类型转换

Rust 没有隐式类型转换,但支持使用 as 进行显式转换。转换写法通常和 C 语言的写法相一致。

fn main() {
    let value: i64 = 1000;
    println!("as u16: {}", value as u16);
    println!("as i16: {}", value as i16);
    println!("as u8: {}", value as u8);
}

使用 as 的结果在 Rust 中 始终 定义明确,并且在不同平台上保持一致。这可能和您对于更改符号或转换为更小类型的直观理解不一样。为清晰起见,请查看文档和注释。

使用 as 进行类型转换是一种快捷好用但容易出错的方法,也在未来进行代码更新时,比如改变了类型或类型范围时会导致潜伏的 Bug。 类型转换最好是用于明确是要进行无条件截取(比如截取低位的 u64u32,忽略高位的数值)。

对于绝对不会出错的转换(比如 u32u64),相比 as,更推荐用 FromInto 以肯定该转换是不会出错的。对于可能出错的转换,如果你想对这些不能成功转换的情况有不同处理方案时,可以考虑 TryFromTryInto

This slide should take about 5 minutes.

请在这张幻灯片之后休息一下。

as 类似于 C++ 静态类型转换。通常不建议在可能丢失数据的情况下使用 as,或者至少应该添加说明性注释。

会经常遇到的是,将整数类型转换为 usize 以用作索引。