当前位置:嗨网首页>书籍在线阅读

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语言中的整数创建指针的窘境。