Rust Slice(切片)類型

切片(Slice)是對數據值的部分引用。

切片這個名字往往出現在生物課上,我們做樣本玻片的時候要從生物體上獲取切片,以供在顯微鏡上觀察。在 Rust 中,切片的意思大致也是這樣,只不過它從數據取材引用。

字符串切片

最簡單、最常用的數據切片類型是字符串切片(String Slice)。

實例

fn main() {
    let s = String::from("broadcast");

    let part1 = &s[0..5];
    let part2 = &s[5..9];

    println!("{}={}+{}", s, part1, part2);
}

運行結果:

broadcast=broad+cast

上圖解釋了字符串切片的原理(注:Rust 中的字符串類型實質上記錄了字符在內存中的起始位置和其長度,我們暫時了解到這一點)。

使用 .. 表示范圍的語法在循環章節中出現過。x..y 表示 [x, y) 的數學含義。.. 兩邊可以沒有運算數:

..y 等價于 0..y
x.. 等價于位置 x 到數據結束
.. 等價于位置 0 到結束

注意:到目前為止,盡量不要在字符串中使用非英文字符,因為編碼的問題。具體原因會在"字符串"章節敘述。

被切片引用的字符串禁止更改其值:

實例

fn?main()?{
????let?mut?s?=?String::from("runoob");
????let?slice?=?&s[0..3];
????s.push_str("yes!"); // 錯誤
????println!("slice?=?{}",?slice);
}

這段程序不正確。

s 被部分引用,禁止更改其值。

實際上,到目前為止你一定疑惑為什么每一次使用字符串都要這樣寫String::from("runoob") ,直接寫 "runoob" 不行嗎?

事已至此我們必須分辨這兩者概念的區別了。在 Rust 中有兩種常用的字符串類型:str 和 String。str 是 Rust 核心語言類型,就是本章一直在講的字符串切片(String Slice),常常以引用的形式出現(&str)。

凡是用雙引號包括的字符串常量整體的類型性質都是 &str

let s = "hello";

這里的 s 就是一個 &str 類型的變量。

String 類型是 Rust 標準公共庫提供的一種數據類型,它的功能更完善——它支持字符串的追加、清空等實用的操作。String 和 str 除了同樣擁有一個字符開始位置屬性和一個字符串長度屬性以外還有一個容量(capacity)屬性。

String 和 str 都支持切片,切片的結果是 &str 類型的數據。

注意:切片結果必須是引用類型,但開發者必須自己明示這一點:

let slice = &s[0..3];

有一個快速的辦法可以將 String 轉換成 &str:

let s1 = String::from("hello");
let s2 = &s1[..];

非字符串切片

除了字符串以外,其他一些線性數據結構也支持切片操作,例如數組:

實例

fn main() {
    let arr = [1, 3, 5, 7, 9];
    let part = &arr[0..3];
    for i in part.iter() {
        println!("{}", i);
    }
}

運行結果:

1
3
5