Rust 基礎(chǔ)系列 #4: Rust 中的數(shù)組和元組
在上一篇文章中,你學(xué)習(xí)到了 Rust 中的 標(biāo)量數(shù)據(jù)類型。它們是整型、浮點(diǎn)數(shù)、字符和布爾值。
在本文中,我們將會(huì)看看 Rust 編程語言中的復(fù)合數(shù)據(jù)類型。
Rust 中的復(fù)合數(shù)據(jù)類型是什么?
復(fù)合數(shù)據(jù)類型可以在一個(gè)變量中存儲(chǔ)多個(gè)值。這些值可以是相同的標(biāo)量數(shù)據(jù)類型,也可以是不同的標(biāo)量數(shù)據(jù)類型。
Rust 編程語言中有兩種這樣的數(shù)據(jù)類型:
- 數(shù)組Array:存儲(chǔ)相同類型的多個(gè)值。
- 元組Tuple:存儲(chǔ)多個(gè)值,可以是相同的類型,也可以是不同的類型。
讓我們了解一下它們吧!
Rust 中的數(shù)組
Rust 編程語言中的數(shù)組具有以下特性:
- 每一個(gè)元素都必須是相同的類型
- 數(shù)組有一個(gè)固定的長(zhǎng)度
- 數(shù)組存儲(chǔ)在堆棧中,即其中存儲(chǔ)的數(shù)據(jù)可以被 迅速 訪問
創(chuàng)建數(shù)組的語法如下:
// 無類型聲明
let variable_name = [element1, element2, ..., elementn];
// 有類型聲明
let variable_name: [data_type; array_length] = [element1, element2, ..., elementn];
數(shù)組中的元素是在方括號(hào)中聲明的。要訪問數(shù)組的元素,需要在方括號(hào)中指定要訪問的索引。
來讓我們看一個(gè)例子來更好地理解這個(gè)。
fn main() {
// 無類型聲明
let greeting = ['H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!'];
// 有類型聲明
let pi: [i32; 10] = [1, 4, 1, 5, 9, 2, 6, 5, 3, 5];
for character in greeting {
print!("{}", character);
}
println!("\nPi: 3.1{}{}{}{}", pi[0], pi[1], pi[2], pi[3]);
}
這里,我定義了一個(gè)字符數(shù)組和另一個(gè)存儲(chǔ) i32
類型的值的數(shù)組。greeting
數(shù)組以單獨(dú)字符的形式存儲(chǔ)了字符串 "Hello world!"
的字符。pi
數(shù)組以單獨(dú)數(shù)字的形式存儲(chǔ)了圓周率小數(shù)點(diǎn)后的前 10 位數(shù)字。
然后,我使用 for
循環(huán)打印了 greeting
數(shù)組的每個(gè)字符。(我很快就會(huì)講到循環(huán)。)然后,我打印了 pi
數(shù)組的前 4 個(gè)值。
Hello world!
Pi: 3.11415
如果你想創(chuàng)建一個(gè)數(shù)組,其中每個(gè)元素都是 y,并且出現(xiàn) x 次,你可以使用以下快捷方式在 Rust 中實(shí)現(xiàn):
let variable_name = [y; x];
來看一個(gè)演示……
fn main() {
let a = [10; 5];
for i in a {
print!("{i} ");
}
println!("");
}
我創(chuàng)建了一個(gè)變量 a
,它的長(zhǎng)度為 5。數(shù)組中的每個(gè)元素都是 '10'。我通過使用 for
循環(huán)打印數(shù)組的每個(gè)元素來驗(yàn)證這一點(diǎn)。
它的輸出如下:
10 10 10 10 10
?? 作為練習(xí),嘗試創(chuàng)建一個(gè)長(zhǎng)度為 x 的數(shù)組,然后嘗試訪問數(shù)組的第 x+1 個(gè)元素。看看會(huì)發(fā)生什么。
Rust 中的元組
Rust 中的元組具有以下特性:
- 就像數(shù)組一樣,元組的長(zhǎng)度是固定的
- 元素可以是相同的/不同的標(biāo)量數(shù)據(jù)類型
- 元組存儲(chǔ)在堆棧中,所以訪問速度更快
創(chuàng)建元組的語法如下:
// 無類型聲明
let variable_name = (element1, element2, ..., element3);
// 有類型聲明
let variable_name: (data_type, ..., data_type) = (element1, element2, ..., element3);
元組的元素寫在圓括號(hào)中。要訪問元素,使用點(diǎn)運(yùn)算符,后跟該元素的索引。
fn main() {
let a = (38, 923.329, true);
let b: (char, i32, f64, bool) = ('r', 43, 3.14, false);
println!("a.0: {}, a.1: {}, a.2: {}", a.0, a.1, a.2);
println!("b.0: {}, b.1: {}, b.2: {}, b.3: {}", b.0, b.1, b.2, b.3);
// 元組解構(gòu)
let pixel = (50, 0, 200);
let (red, green, blue) = pixel;
println!("red: {}, green: {}, blue: {}", red, green, blue);
}
在上面的代碼中,我在第 2 行和第 3 行聲明了兩個(gè)元組。它們只包含我當(dāng)時(shí)想到的隨機(jī)值。但是仔細(xì)看,兩個(gè)元組中每個(gè)元素的數(shù)據(jù)類型都不同。然后,在第 5 行和第 6 行,我打印了兩個(gè)元組的每個(gè)元素。
在第 9 行,我聲明了一個(gè)名為 pixel
的元組,它有 3 個(gè)元素。每個(gè)元素都是組成像素的顏色紅色、綠色和藍(lán)色的亮度值。這個(gè)范圍是從 0 到 255。所以,理想情況下,我會(huì)聲明類型為 (u8, u8, u8)
,但是在學(xué)習(xí)代碼時(shí)不需要這樣優(yōu)化 ; )
然后,在第 10 行,我“解構(gòu)”了 pixel
元組的每個(gè)值,并將其存儲(chǔ)在單獨(dú)的變量 red
、green
和 blue
中。然后,我打印了 red
、green
和 blue
變量的值,而不是 pixel
元組的值。
讓我們看看輸出……
a.0: 38, a.1: 923.329, a.2: true
b.0: r, b.1: 43, b.2: 3.14, b.3: false
red: 50, green: 0, blue: 200
看起來不錯(cuò) : )
額外內(nèi)容:切片
準(zhǔn)確的來說,切片Slice
一個(gè)切片由三個(gè)元素組成:
- 一個(gè)初始索引
- 切片運(yùn)算符(
..
或..=
) - 一個(gè)結(jié)束索引
接下來是數(shù)組切片的一個(gè)示例:
fn main() {
let my_array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
let my_slice = &my_array[0..4];
for element in my_slice {
println!("{element}");
}
}
就像 C 和 C++ 一樣,&
用于存儲(chǔ)變量的引用(而不是原始指針)。所以 &my_array
意味著對(duì)變量 my_array
的引用。
然后,來看看切片。切片由 [0..4]
表示。這里,0
是切片開始的索引。而 4
是切片結(jié)束的索引。這里的 4 是一個(gè)非包含索引。
這是程序輸出,以更好地理解正在發(fā)生的事情:
0
1
2
3
如果你想要一個(gè) 包含 范圍,你可以使用 ..=
作為包含范圍的切片運(yùn)算符。
fn main() {
let my_array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
let my_slice = &my_array[0..=4];
for element in my_slice {
println!("{element}");
}
}
現(xiàn)在,這個(gè)范圍是從第 0 個(gè)元素到第 4 個(gè)元素,下面是輸出來證明這一點(diǎn):
0
1
2
3
4
總結(jié)
本文講到了 Rust 編程語言中的復(fù)合數(shù)據(jù)類型。你學(xué)習(xí)了如何聲明和訪問存儲(chǔ)在數(shù)組和元組類型中的值。此外,你還了解了切片“類型”,以及如何解構(gòu)元組。
在下一章中,你將學(xué)習(xí)如何在 Rust 程序中使用函數(shù)。敬請(qǐng)關(guān)注。