切片
切片能讓您查看更大的集合:
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
是對i32
s 切片的參照。請注意,s
(&[i32]
) 的型別不再提及陣列長度,這有利於我們對不同大小的切片執行運算。 -
切片一律會從其他物件借用。在本例中,
a
必須持續「運作」(在範圍內),時間至少要和切片一樣長。 -
有關修改
a[3]
的問題可能引發有趣的討論,但正解是,基於記憶體安全因素,您無法在執行作業的這個時間點,透過a
修改a[3]
,但可以放心從a
和s
讀取資料。此項目會在您建立切片前運作,並在println
之後,也就是切片不再使用時再次運作。更多細節會在借用檢查器的章節說明。