برشها
یک برش به شما امکان میدهد نما (view) از یک مجموعه بزرگتر داشته باشید:
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:?}"); }
- برشها دادهها را از نوع برششده قرض میگیرند.
- پرسش: اگر
a[3]
را درست قبل از چاپs
تغییر دهید چه اتفاقی میافتد؟
-
ما با قرض گرفتن
a
و مشخص کردن شاخصهای شروع و پایان در براکتها، برش (slice) ایجاد میکنیم. -
اگر برش از شاخص ۰ شروع شود، سینتکس راست به ما اجازه میدهد شاخص شروع را حذف کنیم (یعنی عدد صفر را ننویسیم)، به این معنی که
&a[0..a.len()]
و&a[..a.len()]
یکسان هستند. -
در مورد شاخص آخر نیز همینطور است، بنابراین
&a[2..a.len()]
و&a[2..]
یکسان هستند. -
یک روش ساده برای برش کل آرایه، این است که از
&a[..]
استفاده کنیم.
s
یک مرجع به برش i32 است. توجه داشته باشید که نوع
s
(
&[i32]
) دیگر طول آرایه را ذکر نمیشود. این به ما امکان میدهد محاسباتی را روی برشهایی با اندازههای مختلف انجام دهیم.
-
Slices always borrow from another object. In this example,
a
has to remain ‘alive’ (in scope) for at least as long as our slice. -
The question about modifying
a[3]
can spark an interesting discussion, but the answer is that for memory safety reasons you cannot do it througha
at this point in the execution, but you can read the data from botha
ands
safely. It works before you created the slice, and again after theprintln
, when the slice is no longer used.