English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Срез (Slice) - это частичная ссылка на значение данных.
Название "срез" часто встречается на уроках биологии, когда мы делаем срезы из биологического объекта для наблюдения под микроскопом. В Rust, срез имеет примерно такое же значение, только он берет данные для цитирования.
Самый простой и наиболее часто используемый тип данных для срезания - это строковый срез (String Slice).
fn main() { let s = String::from("broadcast"); let part1 = &s[0..5]; let part2 = &s[5..9]; println!("{}={}+{}", s, part1, part2); }
Результат выполнения:
broadcast=broad+cast
На рисунке объясняется принцип срезания строк (замечание: тип строки в Rust на самом деле записывает начальное положение символа в памяти и его длину, мы временно знаем об этом).
грамматика использования .. была рассмотрена в разделе о циклах.x..y означает [x, y) математическое значение... С两旁 могут отсутствовать операнды:
..y эквивалент 0..y x.. эквивалент позиции x до конца данных .. эквивалент позиции 0 до конца
Внимание:До сих пор старайтесь не использовать в строках символы, отличные от английских букв, из-за проблем с кодировкой. Подробные причины будут описаны в разделе "Строки".
Запрещено изменять значение строки, ссылающейся на срез:
fn main() { let mut s = String::from("w3codebox"); let slice = &s[0..3]; s.push_str("yes!"); // ошибка println!("slice = {}", slice); }
Этот код неправильный.
s частично цитируется и его значение запрещено изменять.
На самом деле, до сих пор вы, возможно, удивлены, почему каждый раз при использовании строки необходимо писать String::from("w3codebox") , напрямую "w3codebox" Не можно ли?
Давайте разберемся, в чем разница между этими двумя концепциями. В Rust есть два常用的 типа строк: str и String. str — это тип ядра языка Rust, который является строковым срезом (String Slice), часто出现的 в виде ссылки (&str).
Все строки, заключенные в двойные кавычки, имеют целостный тип: &str:
let s = "hello";
Здесь s — это переменная типа &str.
Тип String — это один из данных типов, предоставляемых стандартной библиотекой Rust, который обладает более完善ными функциями — он поддерживает полезные операции с строками, такие как добавление, очистка и т.д. Тип String и str, кроме того, имеют атрибуты начала позиции строки и длины строки, также имеют атрибут объема (capacity).
String и str поддерживают срезы, результат которых является данными типа &str.
Обратите внимание: результат среза должен быть типом ссылки, но разработчик должен сам указать на это:
let slice = &s[0..3];
Есть быстрый способ преобразовать String в &str:
let s1 = String::from("hello"); let s2 = &s1[..];
Кроме строк, некоторые другие линейные структуры данных также поддерживают операции срезов, например, массивы:
fn main() { let arr = [1, 3, 5, 7, 9]; let part = &arr[0..3]; for i in part.iter() { println!("{}", i); } }
Результат выполнения:
1 3 5