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

Срезы

Срезы позволяют ссылаться на непрерывную последовательность элементов в коллекции:

// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn main() {
    let a: [i32; 6] = [10, 20, 30, 40, 50, 60];
    println!("a: {a:?}");

    let s: &[i32] = &a[2..4];
    println!("s: {s:?}");
}
  • Срезы заимствуют данные у коллекции.
This slide should take about 7 minutes.
  • Мы создаем срез, заимствуя a и указывая начальный и конечный индексы в скобках.

  • Если срез начинается с индекса 0, синтаксис Rust позволяет отбросить начальный индекс, таким образом, &a[0..a.len()] и &a[..a.len()] идентичны.

  • То же верно и для последнего индекса, поэтому &a[2..a.len()] и &a[2..] идентичны.

  • Чтобы создать срез всего массива, можно использовать &a[..].

  • s — это ссылка на срез элементов типа i32. Обратите внимание, что тип s (&[i32]) больше не указывает длину массива. Это позволяет выполнять вычисления на срезах разных размеров.

  • Срезы всегда заимствуют у другого объекта. В этом примере a должен оставаться «живым» (в области видимости) по крайней мере столько же, сколько и наш срез.

  • Срез нельзя «вырастить» после создания:

    • Нельзя добавлять элементы в срез, так как он не владеет нижележащим буфером.
    • Нельзя расширить срез так, чтобы он указывал на больший участок нижележащего буфера. Срез не знает длины нижележащего буфера, поэтому нельзя понять, насколько его можно расширить.
    • Чтобы получить срез побольше, нужно вернуться к исходному буферу и создать из него срез побольше.