Зрізи

Зріз дає змогу поглянути на більшу колекцію:

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 та вказуючи початковий і кінцевий індекси в дужках.

  • Якщо зріз починається з індексу 0, синтаксис діапазону Rust дозволяє нам відкинути початковий індекс, тобто &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, коли зріз більше не використовується.