Rust 编程中的强制类型转换
rust programmingserver side programmingprogramming
强制类型转换或显式转换仅在 Rust 中允许,Rust 编译器不会为我们执行隐式转换。众所周知,在许多情况下,隐式转换会导致数据丢失,这不是一件好事。
不同类型之间的转换规则与 C 非常相似。但在 Rust 中,当我们想要从一种类型转换为另一种类型时,我们会使用 as 关键字。
示例:
考虑以下示例:
// 抑制所有因强制类型转换溢出而发出的警告。 #![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); }
在上面的代码示例中,我们尝试将 float32 值转换为整数,然后将该整数转换为 char,最后将它们打印到终端。
输出
转换: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 起,当我们将浮点数转换为整数时,‘as’ 关键字还会执行饱和强制转换。
示例
请考虑以下代码作为示例:
// 抑制所有溢出强制转换的警告。 #![allow(overflowing_literals)] fn main() { // 300.0 为 255 println!("301.0 is {}", 301.0_f32 as u8); // -100.0 as u8 is 0 println!("-101.0 as u8 is {}", -101.0_f32 as u8); // nan as u8 is 0 println!("nan as u8 is {}", f32::NAN as u8); }
输出
301.0 为 255 -101.0 as u8 is 0 nan as u8 is 0