基本類型

2018-08-12 22:03 更新

基本類型

Rust 的語(yǔ)言有很多被認(rèn)為是基本的數(shù)據(jù)類型。這意味著他們是語(yǔ)言內(nèi)置的。Rust 是結(jié)構(gòu)化的語(yǔ)言,并且標(biāo)準(zhǔn)庫(kù)在這些類型至上提供了一些有用的其他的類型,但是這些是最基礎(chǔ)的類型。

Booleans

Rust 擁有內(nèi)置的 boolean 類型,名稱為 bool。這種類型的變量能夠被賦值為 true 或者 false:

let x = true;

let y: bool = false;

booleans 比較類型常用的方式是在 if 條件中。

標(biāo)準(zhǔn)庫(kù)文檔說(shuō)明中查看更多的關(guān)于 bool 的說(shuō)明信息。

char

char 類型代表的是一個(gè) Unicode 標(biāo)量值。你可以使用單引號(hào)來(lái)創(chuàng)建 char 類型變量:

let x = 'x';
let two_hearts = '????';

不像其他語(yǔ)言,這意味著在 Rust 中,char 類型不是單個(gè)字節(jié)而是由四個(gè)字節(jié)表示。

同樣,你可以在標(biāo)準(zhǔn)庫(kù)文檔中查看更多關(guān)于 char 的說(shuō)明。

數(shù)值類型

Rust 中有各種數(shù)值類型,可以分為這幾類:有符號(hào)數(shù)和無(wú)符號(hào)數(shù)、固定長(zhǎng)度和可變長(zhǎng)度、浮點(diǎn)數(shù)和整數(shù)。

這些類型包括兩個(gè)部分:類別和大小。例如,u16是一個(gè) 16 位的無(wú)符號(hào)類型。更多的比特位能夠表示更大的數(shù)字。

如果一個(gè)數(shù)字不能從它字面值推斷出他的類型,那么就會(huì)默認(rèn)如下:

let x = 42; // x has type i32
let y = 1.0; // y has type f64

下面列出了不同的數(shù)值類型,同時(shí)連接到標(biāo)準(zhǔn)庫(kù)中的文檔說(shuō)明:

接下來(lái)讓我們?nèi)タ纯此麄兊念悇e:

有符號(hào)和無(wú)符號(hào)數(shù)

整數(shù)類型有兩種:有符號(hào)和無(wú)符號(hào)。為了理解他們的差異,首先讓我們看一個(gè)四位長(zhǎng)度的數(shù)字。對(duì)于有符號(hào)數(shù),四位數(shù)字能夠表示的數(shù)據(jù)范圍是 -8 ~ +7。有符號(hào)數(shù)用二進(jìn)制補(bǔ)碼表示。對(duì)于無(wú)符號(hào)的四位數(shù)字,因?yàn)樗恍枰鎯?chǔ)負(fù)值,所以可以存儲(chǔ)從 0 到 +15。

無(wú)符號(hào)類型使用 u 表示數(shù)據(jù)的類別,而有符號(hào)數(shù)使用 i 表示。i 指的是“整數(shù)”。所以 u8 表示的是無(wú)符號(hào)的 8 位整數(shù),i8 表示的是有符號(hào)的 8 位整數(shù)。

固定大小類型

固定大小的類型由特定數(shù)量的比特位數(shù)表示。有效位數(shù)是 8、16、32、64 位。u32 表示的是無(wú)符號(hào) 32 位整型數(shù),而 i64 表示的是有符號(hào)的 64 位數(shù)。

可變大小類型

Rust 還提供了大小取決于底層機(jī)器指針的大小的類型。這些類型根據(jù)大小分為不同的類別,同樣有有符號(hào)和無(wú)符號(hào)的類型。比如這兩種類型:isize 和 usize。

浮點(diǎn)類型

Rust 也有兩種浮點(diǎn)類型:f32 和 f64。這些符合于 IEEE-754 單、雙精度浮點(diǎn)數(shù)的標(biāo)準(zhǔn)。

數(shù)組

像許多編程語(yǔ)言一樣,Rust 有許多類型能夠表示順序?qū)ο?。最基本的是?shù)組,相同類型的元素和固定大小的順序?qū)ο蟆DJ(rèn)情況下,數(shù)組元素是不可變的。

let a = [1, 2, 3]; // a: [i32; 3]
let mut m = [1, 2, 3]; // m: [i32; 3]

數(shù)組有 [T;N] 類型。我們將在泛型部分談?wù)撨@個(gè) T 符號(hào)。N 是一個(gè)編譯時(shí)常量,表示數(shù)組的長(zhǎng)度。

有一個(gè)快捷的方式用相同的值初始化數(shù)組的每個(gè)元素。在這個(gè)例子中,每個(gè)元素將被初始化為0:

let a = [0; 20]; // a: [i32; 20]

你可以利用 a.len() 得到數(shù)組中元素的個(gè)數(shù):

let a = [1, 2, 3];

println!("a has {} elements", a.len());

你可以使用數(shù)組下標(biāo)訪問(wèn)數(shù)組中某個(gè)特定的元素:

let names = ["Graydon", "Brian", "Niko"]; // names: [&str; 3]

println!("The second name is: {}", names[1]);

下標(biāo)從 0 開始,就像在大多數(shù)編程語(yǔ)言中,第一個(gè)元素是 names[0],第二個(gè)元素是 names[1]。上面的示例輸出 the second name is: Brian。如果您嘗試使用一個(gè)不在數(shù)組范圍內(nèi)的下標(biāo),你會(huì)得到一個(gè)錯(cuò)誤:在運(yùn)行期訪問(wèn)數(shù)組下標(biāo)越界。這樣的訪問(wèn)錯(cuò)誤是其他許多編程語(yǔ)言程序中 bug 的來(lái)源。

你可以在標(biāo)準(zhǔn)庫(kù)文檔中找到更多關(guān)于數(shù)組的說(shuō)明。

切片

“切片”指的是對(duì)另一個(gè)數(shù)據(jù)結(jié)構(gòu)的索引(或“視圖”)。他們是用于允許安全,高效的訪問(wèn)數(shù)組的一部分而不需復(fù)制數(shù)組的內(nèi)容。例如,您可能只是想索引文件中某一行并將其讀入內(nèi)存中。從本質(zhì)上說(shuō),切片不是直接創(chuàng)建的,而是來(lái)自于現(xiàn)有的變量。切片擁有長(zhǎng)度,是可變的也可以設(shè)置不可變,并且在許多方面像數(shù)組是相似的:

let a = [0, 1, 2, 3, 4];
let middle = &a[1..4]; // A slice of a: just the elements 1, 2, and 3
let complete = &a[..]; // A slice containing all of the elements in a

切片有 &[T] 類型。我們將會(huì)在泛型部分講解 T。

你可以在標(biāo)準(zhǔn)庫(kù)文檔中找到更多關(guān)于切片的內(nèi)容。

str

Rust 的 str 類型是最基本的字符串類型。作為一種無(wú)固定大小類型,它本身不是很有用,但是當(dāng)將其使用在引用符號(hào)之后它會(huì)會(huì)變得作用更大,類似于 &str。這里我們不會(huì)進(jìn)一步講解這個(gè)。

你可以在標(biāo)準(zhǔn)庫(kù)文檔中找到更多關(guān)于 str 的說(shuō)明。

元組

元組是有固定大小的有序列表。類似于:

let x = (1, "hello");

括號(hào)和逗號(hào)構(gòu)成了長(zhǎng)度為 2 的元組。如下是相同的代碼,但是有類型說(shuō)明:

let x: (i32, &str) = (1, "hello");

正如你所看到的,元組的類型看上去和元組一樣,但每個(gè)位置都有一個(gè)類型名稱而不是元素值。細(xì)心的讀者會(huì)注意到,元組是異構(gòu):在該元組中有一個(gè) i32 類型和一個(gè) &str 類型的元素。在系統(tǒng)編程語(yǔ)言中,字符串比其他語(yǔ)言稍微更復(fù)雜點(diǎn)。當(dāng)下,我們把 &str 當(dāng)作字符串切片,之后我們會(huì)了解更多的。

如果兩個(gè)元組有相同的元素類型和相同的參數(shù)數(shù)量,那么你可以將一個(gè)元組賦值給另外一個(gè)。,當(dāng)元組有相同的長(zhǎng)度時(shí),他們具有相同的參數(shù)數(shù)量。

let mut x = (1, 2); // x: (i32, i32)
let y = (2, 3); // y: (i32, i32)

x = y;

你可以使用解析符來(lái)訪問(wèn)元組中的字段。如下:

let (x, y, z) = (1, 2, 3);

println!("x is {}", x);

記得以前我們?cè)f(shuō)過(guò)左邊操作符 let 語(yǔ)句比賦值綁定有強(qiáng)的能力嗎?現(xiàn)在我們就可以解釋了,我們可以在左邊的 let 之后編寫一個(gè) pattern,如果它和右邊的語(yǔ)句相匹配,那么我們就可以同時(shí)進(jìn)行多個(gè)元素的賦值綁定。在這種情況下,let “析構(gòu)”或者 “分解” 元組,接著進(jìn)行三個(gè)元素的賦值。

這種模式是非常強(qiáng)大的,我們將會(huì)在后面的章節(jié)再次看到。

你可以在括號(hào)中使用逗號(hào)來(lái)消除是單個(gè)元素還是不是單元素的二義性。

(0,); // single-element tuple
(0); // zero in parentheses

元組索引

你還可以使用索引的方式訪問(wèn)元組的字段:

let tuple = (1, 2, 3);

let x = tuple.0;
let y = tuple.1;
let z = tuple.2;

println!("x is {}", x);

類似于數(shù)組索引,下標(biāo)從零開始,但與數(shù)組索引不同的是它使用一個(gè) . 而不是 [] 進(jìn)行訪問(wèn)。

你可以在標(biāo)準(zhǔn)庫(kù)文檔中找到更多的關(guān)于元組的說(shuō)明。

函數(shù)

函數(shù)同樣也是一個(gè)類型!如下所示:

fn foo(x: i32) -> i32 { x }

let x: fn(i32) -> i32 = foo;

在這種情況下,x 是帶一個(gè) i32 類型的參數(shù)和返回值為 i32 類型的函數(shù)指針。

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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)