English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Тип данных Rust Slice (срез)

Срез (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