类型转换
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。 类型转换最好是用于明确是要进行无条件截取(比如截取低位的 u64
为 u32
,忽略高位的数值)。
对于绝对不会出错的转换(比如 u32
转 u64
),相比 as
,更推荐用 From
或 Into
以肯定该转换是不会出错的。对于可能出错的转换,如果你想对这些不能成功转换的情况有不同处理方案时,可以考虑 TryFrom
和 TryInto
。
This slide should take about 5 minutes.
请在这张幻灯片之后休息一下。
as
类似于 C++ 静态类型转换。通常不建议在可能丢失数据的情况下使用 as
,或者至少应该添加说明性注释。
会经常遇到的是,将整数类型转换为 usize
以用作索引。