W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
Rust 以其安全性為重點,為不同的類型之間的轉換提供了不同的方法。首先,as 用于數(shù)據(jù)類型安全轉換 。相反,transmute 允許類型之間的任意轉換,是 Rust 的最危險的特征!
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 函數(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)
除此之外,你需要自己學習相關知識!
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: