bool
布爾類型(bool)代表的是“是”和“否”的二值邏輯。它有兩個(gè)值:true和false。
一般用在邏輯表達(dá)式中,可以執(zhí)行“與”“或”“非”等運(yùn)算。
char
字符類型由char表示。它可以描述任何一個(gè)符合unicode標(biāo)準(zhǔn)的字符值。在代碼中,單個(gè)的字符字面量用單引號(hào)包圍。
字符類型字面量也可以使用轉(zhuǎn)義符:
因?yàn)閏har類型的設(shè)計(jì)目的是描述任意一個(gè)unicode字符,因此它占據(jù)的內(nèi)存空間不是1個(gè)字節(jié),而是4個(gè)字節(jié)。
對(duì)于ASCⅡ字符其實(shí)只需占用一個(gè)字節(jié)的空間,因此Rust提供了單字節(jié)字符字面量來(lái)表示ASCⅡ字符。我們可以使用一個(gè)字母b在字符或者字符串前面,代表這個(gè)字面量存儲(chǔ)在u8類型數(shù)組中,這樣占用空間比char型數(shù)組要小一些。示例如下:
整數(shù)類型
Rust有許多的數(shù)字類型,主要分為整數(shù)類型和浮點(diǎn)數(shù)類型。本節(jié)講解整數(shù)類型。各種整數(shù)類型之間的主要區(qū)分特征是:有符號(hào)/無(wú)符號(hào),占據(jù)空間大小。
需要特別關(guān)注的是isize和usize類型。
它們占據(jù)的空間是不定的,與指針占據(jù)的空間一致,與所在的平臺(tái)相關(guān)。如果是32位系統(tǒng)上,則是32位大?。蝗绻?4位系統(tǒng)上,則是64位大小。
在C++中與它們相對(duì)應(yīng)的類似類型是int_ptr和uint_ptr。Rust的這一策略與C語(yǔ)言不同,C語(yǔ)言標(biāo)準(zhǔn)中對(duì)許多類型的大小并沒有做強(qiáng)制規(guī)定,比如int、long、double等類型,在不同平臺(tái)上都可能是不同的大小,這給許多程序員帶來(lái)了不必要的麻煩。相反,在語(yǔ)言標(biāo)準(zhǔn)中規(guī)定好各個(gè)類型的大小,讓編譯器針對(duì)不同平臺(tái)做適配,生成不同的代碼,是更合理的選擇。
數(shù)字類型的字面量表示可以有許多方式:
字面量后面可以跟后綴,可代表該數(shù)字的具體類型,從而省略掉顯示類型標(biāo)記:
我們可以為任何一個(gè)類型添加方法,整型也不例外。比如在標(biāo)準(zhǔn)庫(kù)中,整數(shù)類型有一個(gè)方法是pow,它可以計(jì)算n次冪,于是我們可以這么使用:
我們甚至可以不使用變量,直接對(duì)整型字面量調(diào)用函數(shù):
對(duì)于整數(shù)類型,如果Rust編譯器通過(guò)上下文無(wú)法分析出該變量的具體類型,則自動(dòng)默認(rèn)為i32類型。比如:
整數(shù)溢出
在整數(shù)的算術(shù)運(yùn)算中,有一個(gè)比較頭疼的事情是“溢出”。
在C語(yǔ)言中,對(duì)于無(wú)符號(hào)類型,算術(shù)運(yùn)算永遠(yuǎn)不會(huì)overflow,如果超過(guò)表示范圍,則自動(dòng)舍棄高位數(shù)據(jù)。
對(duì)于有符號(hào)類型,如果發(fā)生了overflow,標(biāo)準(zhǔn)規(guī)定這是undefined behavior,也就是說(shuō)隨便怎么處理都可以。
未定義行為有利于編譯器做一些更激進(jìn)的性能優(yōu)化,但是這樣的規(guī)定有可能導(dǎo)致在程序員不知情的某些極端場(chǎng)景下,產(chǎn)生詭異的bug。
Rust的設(shè)計(jì)思路更傾向于預(yù)防bug,而不是無(wú)條件地壓榨效率,Rust設(shè)計(jì)者希望能盡量減少“未定義行為”。
比如徹底杜絕“Segment Fault”這種內(nèi)存錯(cuò)誤是Rust的一個(gè)重要設(shè)計(jì)目標(biāo)。
當(dāng)然還有其他許多種類的bug,即便是無(wú)法完全解決,我們也希望能盡量避免。
整數(shù)溢出就是這樣的一種bug。
Rust在這個(gè)問題上選擇的處理方式為:默認(rèn)情況下,在debug模式下編譯器會(huì)自動(dòng)插入整數(shù)溢出檢查,一旦發(fā)生溢出,則會(huì)引發(fā)panic。
在release模式下,不檢查整數(shù)溢出,而是采用自動(dòng)舍棄高位的方式。示例如下:
Rust編譯器還提供了一個(gè)獨(dú)立的編譯開關(guān)供我們使用,通過(guò)這個(gè)開關(guān),可以設(shè)置溢出時(shí)的處理策略:
$rustc -C overflow-checks=no test.rs
“-C overflow-checks=”可以寫“yes”或者“no”,打開或者關(guān)閉溢出檢查。
如果在某些場(chǎng)景下,用戶確實(shí)需要更精細(xì)地自主控制整數(shù)溢出的行為,可以調(diào)用標(biāo)準(zhǔn)庫(kù)中的checked_*、saturating_*和wrapping_*系列函數(shù)。
輸出結(jié)果為:
checked_*系列函數(shù)返回的類型是Option<_>,當(dāng)出現(xiàn)溢出的時(shí)候,返回值是None。
saturating_*系列函數(shù)返回類型是整數(shù),如果溢出,則給出該類型可表示范圍的“最大/最小”值。
wrapping_*系列函數(shù)則是直接拋棄已經(jīng)溢出的最高位,將剩下的部分返回。
在對(duì)安全性要求非常高的情況下,強(qiáng)烈建議用戶盡量使用這幾個(gè)方法替代默認(rèn)的算術(shù)運(yùn)算符來(lái)做數(shù)學(xué)運(yùn)算,這樣表意更清晰。
在Rust標(biāo)準(zhǔn)庫(kù)中就大量使用了這幾個(gè)方法,而不是簡(jiǎn)單地使用算術(shù)運(yùn)算符,值得大家參考。
在很多情況下,整數(shù)溢出應(yīng)該被處理為截?cái)?,即丟棄最高位。
浮點(diǎn)類型
Rust提供了基于IEEE 754-2008標(biāo)準(zhǔn)的浮點(diǎn)類型。按占據(jù)空間大小區(qū)分,分別為f32和f64,其使用方法與整型差別不大。浮點(diǎn)數(shù)字面量表示方式有如下幾種:
Infinite和Nan是帶來(lái)更多麻煩的特殊狀態(tài)。Infinite代表的是“無(wú)窮大”,Nan代表的是“不是數(shù)字”(not a number)。
指針類型
- 同一個(gè)類型,某些時(shí)候可以指定它在棧上,某些時(shí)候可以指定它在堆上。內(nèi)存分配方式可以取決于使用方式,與類型本身無(wú)關(guān)。
- 既可以直接訪問數(shù)據(jù),也可以通過(guò)指針間接訪問數(shù)據(jù)??梢葬槍?duì)任何一個(gè)對(duì)象取得指向它的指針。
- 既可以在復(fù)合數(shù)據(jù)類型中直接嵌入別的類型的實(shí)體,也可以使用指針,間接指向別的類型。
- 甚至可能在復(fù)合數(shù)據(jù)類型末尾嵌入不定長(zhǎng)數(shù)據(jù)構(gòu)造出不定長(zhǎng)的復(fù)合數(shù)據(jù)類型。Rust里面也有指針類型,而且不止一種指針類型。
在標(biāo)準(zhǔn)庫(kù)中還有一種封裝起來(lái)的可以當(dāng)作指針使用的類型,叫“智能指針”(smart pointer)。
類型轉(zhuǎn)換
Rust對(duì)不同類型之間的轉(zhuǎn)換控制得非常嚴(yán)格。即便是下面這樣的程序,也會(huì)出現(xiàn)編譯錯(cuò)誤:
Rust提供了一個(gè)關(guān)鍵字as,專門用于這樣的類型轉(zhuǎn)換:
tuple
tuple指的是“元組”類型,它通過(guò)圓括號(hào)包含一組表達(dá)式構(gòu)成。tuple內(nèi)的元素沒有名字。tuple是把幾個(gè)類型組合到一起的最簡(jiǎn)單的方式。比如:
元組內(nèi)部也可以一個(gè)元素都沒有。這個(gè)類型單獨(dú)有一個(gè)名字,叫unit(單元類型):let empty:()=();
可以說(shuō),unit類型是Rust中最簡(jiǎn)單的類型之一,也是占用空間最小的類型之一。
struct
結(jié)構(gòu)體(struct)與元組類似,也可以把多個(gè)類型組合到一起,作為新的類型。區(qū)別在于,它的每個(gè)元素都有自己的名字。舉個(gè)例子:
tuple struct
Rust有一種數(shù)據(jù)類型叫作tuple struct,它就像是tuple和struct的混合。區(qū)別在于,tuplestruct有名字,而它們的成員沒有名字:
enum
如果說(shuō)tuple、struct、tuple struct在Rust中代表的是多個(gè)類型的“與”關(guān)系,那么 enum類型在Rust中代表的就是多個(gè)類型的“或”關(guān)系。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-792195.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-792195.html
到了這里,關(guān)于Rust-類型的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!