Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Слайсы

Подобно тому, как ссылка указывает на данные, принадлежащие некой переменной, слайс — это специальная ссылка, которая указывает на последовательность элементов, как правило, принадлежащих другой переменной (вектору, массиву, и т.д.).

Аналогично тому, как ссылка создаётся оператором &, слайс создаётся оператором &[].

#![allow(unused)]
fn main() {
let arr: [i32; 5]  = [0, 1, 2, 3, 4]; // массив
let slice1: &[i32] = &arr[..];        // слайс на все элементы массива
let slice2: &[i32] = &arr[2..=4];     // слайс на элементы со 2го по 4-й включительно

// альтернативно можно было бы написать 
// let slice2: &[i32] = &arr[2..5]; // то есть со 2-го до 5-го не включительно
}

Слайс позволяет обращаться к элементам по их индексу (относительно начала слайса, а не относительно начала оригинальной последовательности).

fn main() {
  let arr = [0, 1, 2, 3, 4];
  let slice: &[i32] = &arr[2..=4]; // слайс на элементы со 2го по 4-й
  println!("{}", slice.len()); // 3 (размер слайса)
  println!("{}", slice[2]);    // 4 (2-й по индексу элемент слайса)
}

В отличие от обычных ссылок, которые, как правило, эфемерны (не представлены отдельными ячейками в памяти), слайсы хранятся в памяти в виде пары полей:

  • адрес первого элемента последовательности
  • количество элементов

По умолчанию слайсы, как и ссылки, — немутабельны. Для того, чтобы сделать мутабельный слайс, нужно использовать ключевое слово mut.

Рассмотрим пример изменения элементов вектора посредством мутабельного слайса:

fn main() {
  let mut v: Vec<i32> = Vec::with_capacity(5);
  v.push(0);
  v.push(1);
  v.push(2);
  v.push(3);

  let slice: &mut [i32] = &mut v[1..3]; // слайс на элементы со 1го до 3го
  slice[0] = 9;

  println!("v[1]: {}", v[1]); // 9
}

В памяти это соотношение вектора и слайса выглядит так: