Срезы
Срезы позволяют ссылаться на непрерывную последовательность элементов в коллекции:
// 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:?}");
}
- Срезы заимствуют данные у коллекции.
-
Мы создаем срез, заимствуя
aи указывая начальный и конечный индексы в скобках. -
Если срез начинается с индекса 0, синтаксис Rust позволяет отбросить начальный индекс, таким образом,
&a[0..a.len()]и&a[..a.len()]идентичны. -
То же верно и для последнего индекса, поэтому
&a[2..a.len()]и&a[2..]идентичны. -
Чтобы создать срез всего массива, можно использовать
&a[..]. -
s— это ссылка на срез элементов типаi32. Обратите внимание, что типs(&[i32]) больше не указывает длину массива. Это позволяет выполнять вычисления на срезах разных размеров. -
Срезы всегда заимствуют у другого объекта. В этом примере
aдолжен оставаться «живым» (в области видимости) по крайней мере столько же, сколько и наш срез. -
Срез нельзя «вырастить» после создания:
- Нельзя добавлять элементы в срез, так как он не владеет нижележащим буфером.
- Нельзя расширить срез так, чтобы он указывал на больший участок нижележащего буфера. Срез не знает длины нижележащего буфера, поэтому нельзя понять, насколько его можно расширить.
- Чтобы получить срез побольше, нужно вернуться к исходному буферу и создать из него срез побольше.