切片

切片能讓您查看更大的集合:

fn main() {
    let mut a: [i32; 6] = [10, 20, 30, 40, 50, 60];
    println!("a: {a:?}");

    let s: &[i32] = &a[2..4];

    println!("s: {s:?}");
}
  • 切片會從切片型別借用資料。
  • 問題:如果在輸出 s 前修改 a[3],會有什麼影響?
  • 我們會建立一個切片,方法是先借用 a,然後在括號中指定起始和結束索引。

  • 如果切片從索引 0 開始,Rust 的範圍語法可允許我們捨棄起始索引,也就是說,&a[0..a.len()]&a[..a.len()] 意思相同。

  • 同理,最後一個索引也是如此,因此 &a[2..a.len()]&a[2..] 意思相同。

  • 因此,為了輕鬆建立完整陣列的切片,我們可以使用 &a[..]

  • s 是對 i32s 切片的參照。請注意,s (&[i32]) 的型別不再提及陣列長度,這有利於我們對不同大小的切片執行運算。

  • 切片一律會從其他物件借用。在本例中,a 必須持續「運作」(在範圍內),時間至少要和切片一樣長。

  • 有關修改 a[3] 的問題可能引發有趣的討論,但正解是,基於記憶體安全因素,您無法在執行作業的這個時間點,透過 a 修改 a[3],但可以放心從 as 讀取資料。此項目會在您建立切片前運作,並在 println 之後,也就是切片不再使用時再次運作。更多細節會在借用檢查器的章節說明。