49-强制类型转换
7.11 强制类型转换
类型转换是一种将类型降级或升级到其他类型的机制。当类型转换隐式地发生时,它被称为强制类型转换(coercion)。Rust还允许各种级别的类型转换,非常明显的例子是基元数字类型。你可能需要将u8类型的数据升级为u64类型的数据或者将i64类型的数据截断为i32类型的数据。要执行简单的强制类型转换,我们会使用关键字as,如下所示:
let a = 34u8;
let b = a as u64;
除了基元类型之外——类型转换还支持更高级的类型。如果实现了特定的特征,我们可以将类型的引用类型转换为它的特征对象。所以我们可以做与以下类似的操作:
// cast_trait_object.rs
use std::fmt::Display;
fn show_me(item: &Display) {
println!("{}", item);
}
fn main() {
let a = "hello".to_string();
let b = &a;
show_me(b);
// let c = b as &Display;
}
还有很多指针类型支持其他类型的转换。
- 将mut T转换为const T。另一种方法在安全的Rust代码中是被禁止的,并且需要一个unsafe代码块。
- 将&T转换为 *const T,反之亦然。
类型转换还有另一种显式和不安全的版本被称为变形(transmute)。因为它是不安全的,所以在你不知道后果的情况下使用它是非常危险的。当无知地使用它时,它可能会将你引入类似使用C语言中的整数创建指针的窘境。