類型轉換

2018-08-12 22:03 更新

類型轉換

Rust 以其安全性為重點,為不同的類型之間的轉換提供了不同的方法。首先,as 用于數(shù)據(jù)類型安全轉換 。相反,transmute 允許類型之間的任意轉換,是 Rust 的最危險的特征!

as

as 關鍵字可以做基本的轉換:

let x: i32 = 5;

let y = x as i64;

然而,它只允許某些類型的轉換:

let a = [0u8, 0u8, 0u8, 0u8];

let b = a as u32; // four eights makes 32

這個錯誤如下:

error: non-scalar cast: `[u8; 4]` as `u32`
let b = a as u32; // four eights makes 32

這是一個“非標量轉換” ,因為我們這里有多個值:數(shù)組的四個元素。這些類型的轉換是非常危險的,因為他們對多個底層結構的實現(xiàn)方式做了假設。為此,我們需要一些更危險的東西。

transmute

transmute 函數(shù)是由內(nèi)在編譯器提供的,它做的非常簡單,但非??膳隆K嬖V Rust 把一種類型的值當作它是另一種類型的值。它這樣做不管類型檢查系統(tǒng),完全信任你?!  ?/p>

在我們前面的例子中,我們知道,一個數(shù)組的四個元素 u8 正好表示一個 u32,所以我們做這樣的轉換。使用 transmute 而不是 as,Rust 代碼如下:

use std::mem;

unsafe {
let a = [0u8, 0u8, 0u8, 0u8];

let b = mem::transmute::<[u8; 4], u32>(a);
}

為了成功編譯我們必須在一個 unsafe 塊中封裝操作。從技術上講,只有 mem::transmute 調(diào)用自己本身的時候需要在在代碼塊中。但是在把所有相關的一切封裝在內(nèi)的情況下是可以調(diào)用自己的,所以你知道在哪里看。在這種情況下,a 的細節(jié)也很重要,它們確實在代碼塊中。你會看到其它風格的代碼,有時上下文是太遠,將所有代碼封裝在 unsafe 不是一個好主意。    

雖然 transmute 確實很少檢查,它至少能確保類型是相同大小的??聪旅孢@段代碼:

use std::mem;

unsafe {
let a = [0u8, 0u8, 0u8, 0u8];

let b = mem::transmute::<[u8; 4], u64>(a);
}

這個錯誤是:

error: transmute called on types with different sizes: [u8; 4] (32 bits) to u64
(64 bits)

除此之外,你需要自己學習相關知識!

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號