Срез — это указатель на блок памяти. Срезы могут использоваться для доступа к частям данных, хранящимся в смежных блоках памяти. Его можно использовать со структурами данных, такими как массивы, векторы и строки. Срезы используют индексные номера для доступа к частям данных. Размер среза определяется во время выполнения.
Ломтики — это указатели на фактические данные. Они передаются по ссылке на функции, которые также известны как заимствование.
Например, срезы могут использоваться для извлечения части строкового значения. Нарезанная строка — это указатель на фактический строковый объект. Поэтому нам нужно указать начальный и конечный индекс строки. Индекс начинается с 0, как массивы.
Синтаксис
let sliced_value = &data_structure[start_index..end_index]
Минимальное значение индекса равно 0, а максимальное значение индекса — это размер структуры данных. Обратите внимание, что end_index не будет включен в окончательную строку.
На приведенной ниже схеме показан пример строки учебников , которая состоит из 9 символов. Индекс первого символа равен 0, а индекс последнего символа — 8.
Следующий код выбирает 5 символов из строки (начиная с индекса 4).
fn main() { let n1 = "Tutorials".to_string(); println!("length of string is {}",n1.len()); let c1 = &n1[4..9]; // fetches characters at 4,5,6,7, and 8 indexes println!("{}",c1); }
Выход
length of string is 9 rials
Иллюстрация — Нарезка целочисленного массива
Функция main () объявляет массив из 5 элементов. Он вызывает функцию use_slice () и передает ей фрагмент из трех элементов (указывает на массив данных). Срезы передаются по ссылке. Функция use_slice () печатает значение среза и его длину.
fn main(){ let data = [10,20,30,40,50]; use_slice(&data[1..4]); //this is effectively borrowing elements for a while } fn use_slice(slice:&[i32]) { // is taking a slice or borrowing a part of an array of i32s println!("length of slice is {:?}",slice.len()); println!("{:?}",slice); }
Выход
length of slice is 3 [20, 30, 40]
Изменчивые ломтики
Ключевое слово & mut может использоваться для пометки фрагмента как изменяемого.
fn main(){ let mut data = [10,20,30,40,50]; use_slice(&mut data[1..4]); // passes references of 20, 30 and 40 println!("{:?}",data); } fn use_slice(slice:&mut [i32]) { println!("length of slice is {:?}",slice.len()); println!("{:?}",slice); slice[0] = 1010; // replaces 20 with 1010 }
Выход
length of slice is 3 [20, 30, 40] [10, 1010, 30, 40, 50]
Приведенный выше код передает изменяемый фрагмент функции use_slice () . Функция изменяет второй элемент исходного массива.