强制转换或显式转换只允许在Rust中进行,而不允许使用Rust的编译器进行隐式转换。众所周知,在许多情况下,隐式转换会导致数据丢失,这不是一件好事。
在不同类型之间进行转换的规则与C非常相似。不过,在Rust中,当我们要从一种类型转换为另一种类型时,我们使用as关键字。
看以下示例:
// 禁止来自溢出的强制转换的所有警告。
#![allow(overflowing_literals)]
fn main() {
let decimal = 65.43_f32;
//错误!没有隐式转换
// 设整数:u8 =十进制;
// FIXME ^注释掉这行
// 显式转换
let integer = decimal as u8;
let character = integer as char;
println!("Casting: {} -> {} -> {}", decimal, integer, character);
}在上面的代码示例中,我们尝试将float32值转换为整数,然后将该整数转换为char,然后将其最终输出到终端。
输出结果
Casting: 65.43 -> 65 -> A
如果我们删除隐式转换的注释,则编译器将引发错误。
考虑下面显示的更新代码:
// 禁止来自溢出的强制转换的所有警告。
#![allow(overflowing_literals)]
fn main() {
let decimal = 65.43_f32;
//错误!没有隐式转换
let integer: u8 = decimal;
// FIXME ^注释掉这行
// 显式转换
let integer = decimal as u8;
let character = integer as char;
println!("Casting: {} -> {} -> {}", decimal, integer, character);
}输出结果
error[E0308]: mismatched types --> src/main.rs:8:23 | 8| let integer: u8 = decimal; | -- ^^^^^^^ expected `u8`, found `f32` | | | expected due to this
从Rust 1.45开始,当我们将float转换为int时,关键字“ as”也执行饱和类型转换。
以下面显示的代码为例:
// 禁止来自溢出的强制转换的所有警告。
#![allow(overflowing_literals)]
fn main() {
// 300.0是255
println!("301.0 is {}", 301.0_f32 as u8);
// -100.0,因为u8为0
println!("-101.0 as u8 is {}", -101.0_f32 as u8);
// nan因为u8为0
println!("nan as u8 is {}", f32::NAN as u8);
}输出结果
301.0 is 255 -101.0 as u8 is 0 nan as u8 is 0