Rust 程式設計中的強制轉換


在 Rust 中只允許強制轉換或顯式轉換,編譯器不會自動進行隱式轉換。眾所周知,在許多情況下,隱式轉換會導致資料丟失,這是一個嚴重的問題。

在不同型別之間轉換的規則與 C 語言非常相似。但是,在 Rust 中,當我們要從一種型別轉換為另一種型別時,我們使用 as 關鍵字。

示例

考慮以下示例

 即時演示

// Suppress all warnings from casts which overflow.
#![allow(overflowing_literals)]

fn main() {
   let decimal = 65.43_f32;

   // Error! No implicit conversion
   // let integer: u8 = decimal;
   // FIXME ^ Comment out this line

   // Explicit conversion
   let integer = decimal as u8;
   let character = integer as char;

   println!("Casting: {} -> {} -> {}", decimal, integer, character);
}

在上面的程式碼示例中,我們嘗試將一個 float32 值轉換為一個整數,然後將該整數轉換為一個 char,最後將它們列印到終端。

輸出

Casting: 65.43 -> 65 -> A

如果我們刪除對隱式轉換的註釋,則編譯器將丟擲一個錯誤。

示例

考慮下面顯示的更新後的程式碼

 即時演示

// Suppress all warnings from casts which overflow.
#![allow(overflowing_literals)]

fn main() {
   let decimal = 65.43_f32;

   // Error! No implicit conversion
   let integer: u8 = decimal;
   
   // FIXME ^ Comment out this line
   // Explicit conversion

   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’ 關鍵字還會執行 飽和轉換。

示例

考慮下面顯示的程式碼作為一個示例

// Suppress all warnings from casts which overflow.
#![allow(overflowing_literals)]

fn main() {
   // 300.0 is 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 is 255
-101.0 as u8 is 0
nan as u8 is 0

最後更新時間:03-04-2021

334 次瀏覽

開啟你的 職業

透過完成課程獲得認證

開始使用
廣告