برش‌ها

یک برش به شما امکان می‌دهد نما (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 تغییر دهید چه اتفاقی می‌افتد؟
This slide should take about 10 minutes.
  • ما با قرض گرفتن 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 through a at this point in the execution, but you can read the data from both a and s safely. It works before you created the slice, and again after the println, when the slice is no longer used.