99re热视频这里只精品,久久久天堂国产精品女人,国产av一区二区三区,久久久精品成人免费看片,99久久精品免费看国产一区二区三区

類型轉(zhuǎn)換

2018-08-12 22:03 更新

類型轉(zhuǎn)換

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

as

as 關(guān)鍵字可以做基本的轉(zhuǎn)換:

let x: i32 = 5;

let y = x as i64;

然而,它只允許某些類型的轉(zhuǎn)換:

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

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

這個(gè)錯(cuò)誤如下:

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

這是一個(gè)“非標(biāo)量轉(zhuǎn)換” ,因?yàn)槲覀冞@里有多個(gè)值:數(shù)組的四個(gè)元素。這些類型的轉(zhuǎn)換是非常危險(xiǎn)的,因?yàn)樗麄儗?duì)多個(gè)底層結(jié)構(gòu)的實(shí)現(xiàn)方式做了假設(shè)。為此,我們需要一些更危險(xiǎn)的東西。

transmute

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

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

use std::mem;

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

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

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

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

use std::mem;

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

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

這個(gè)錯(cuò)誤是:

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

除此之外,你需要自己學(xué)習(xí)相關(guān)知識(shí)!

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)