برش‌ها

یک برش به شما امکان می‌دهد نما (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]) دیگر طول آرایه را ذکر نمی‌شود. این به ما امکان می‌دهد محاسباتی را روی برش‌هایی با اندازه‌های مختلف انجام دهیم.

  • برش‌ها همیشه از یک شیء دیگر قرض می‌گیرند. در این مثال، a باید حداقل به اندازه طول‌عمر برش ما، زنده (در محدوده) باقی بماند.

  • پرسش در مورد تغییر a[3] می تواند یک بحث جالب را شروع کند، اما پاسخ‌اش این است که به دلایل ایمنی حافظه، نمی‌توانید این کار را از طریق a در این مرحله از اجرا انجام دهید، اما می‌توانید داده‌ها را از هر دو a و s به طور ایمن بخوانید. این کار قبل از ایجاد برش و دوباره بعد از println! کار میکند، زمانی که برش دیگر استفاده نمی شود. جزئیات بیشتری در بخش بررسی‌کننده‌قرض (the borrow checker) توضیح خواهیم داد.