0Pricing
Learn Rust Coding · Урок

Срезы

Заимствованные представления

«Срезы» — бесплатный урок Learn Rust Coding на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn Rust Coding, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn Rust Coding содержит 4 уроков всего.

What Is a Slice?

Срез (slice) — это заимствованное представление непрерывной части коллекции. Он не владеет данными, а указывает на уже существующие данные.

Срезы записываются с использованием диапазона внутри квадратных скобок.

fn main() {
    let arr = [1, 2, 3, 4, 5];
    let part = &arr[1..4];
    println!("{:?}", part);
}

Slice Range Syntax

Диапазоны выбирают начальный и конечный индекс. Конечный индекс не включается.

  • &v[1..4] — индексы 1, 2, 3.
  • &v[..3] — от начала до 3.
  • &v[2..] — от 2 до конца.
fn main() {
    let v = vec![10, 20, 30, 40];
    println!("{:?}", &v[..2]);
    println!("{:?}", &v[2..]);
}

String Slices

Срез строки &str — это представление части String. Диапазоны индексов задаются по позиции байта.

fn main() {
    let s = String::from("hello world");
    let hello = &s[0..5];
    let world = &s[6..11];
    println!("{} {}", hello, world);
}

Whole-Collection Slices

Используйте &v[..], чтобы получить срез всей коллекции. Именно так Vec заимствуется в виде среза.

fn main() {
    let v = vec![1, 2, 3];
    let whole = &v[..];
    println!("{:?}", whole);
}

Slices as Parameters

Функции, принимающие &[T], могут работать как с массивами, так и с векторами. Это делает их гибкими.

fn sum(items: &[i32]) -> i32 {
    let mut total = 0;
    for x in items {
        total += x;
    }
    total
}

fn main() {
    let v = vec![1, 2, 3];
    let a = [4, 5, 6];
    println!("{} {}", sum(&v), sum(&a));
}

Slices Borrow, Not Own

Поскольку срез заимствует данные, исходная коллекция должна оставаться в памяти всё время, пока используется срез. Компилятор обеспечивает соблюдение этого правила.

fn main() {
    let v = vec![100, 200, 300];
    let s = &v[0..2];
    println!("slice {:?}, original {:?}", s, v);
}

Slice Length

Как и другие коллекции, срезы имеют метод len(), который возвращает количество содержащихся в них элементов.

fn main() {
    let v = vec![5, 6, 7, 8, 9];
    let middle = &v[1..4];
    println!("length {}", middle.len());
}

first and last

Срезы (slices) предоставляют методы first() и last(), которые возвращают Option, что позволяет безопасно обрабатывать пустые срезы.

fn main() {
    let data = [10, 20, 30];
    let s = &data[..];
    println!("{:?} {:?}", s.first(), s.last());
}

Iterating a Slice

Вы можете выполнять итерацию по срезу так же, как и по любой другой коллекции.

fn main() {
    let v = vec![1, 2, 3, 4];
    for x in &v[1..3] {
        println!("{}", x);
    }
}

A First-Word Function

Распространенный сценарий использования срезов: получение среза существующего текста, например, первого слова предложения.

fn first_word(s: &str) -> &str {
    let bytes = s.as_bytes();
    for (i, &b) in bytes.iter().enumerate() {
        if b == b' ' {
            return &s[0..i];
        }
    }
    s
}

fn main() {
    println!("{}", first_word("hello there"));
}

Why Slices Are Safe

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

fn main() {
    let words = vec!["a", "b", "c", "d"];
    let pair = &words[1..3];
    println!("{:?}", pair);
}

Quick Check

Вспомните, что представляет собой срез.

Recap

Срезы (slices) в Rust:

  • Заимствованное представление: &v[start..end], где end не включается.
  • &str — это строковый срез; &[T] — срез массива или вектора.
  • Параметры типа «срез» принимают как массивы, так и векторы.
  • Borrow checker обеспечивает безопасность использования срезов.
fn average(nums: &[i32]) -> i32 {
    nums.iter().sum::<i32>() / nums.len() as i32
}

fn main() {
    let v = vec![4, 8, 12];
    println!("{}", average(&v[..]));
}

Часто задаваемые вопросы

Урок «Срезы» бесплатный?

Да — полный текст урока «Срезы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn Rust Coding, подпишись на CoddyKit PRO. Курс Learn Rust Coding содержит 4 уроков всего.

Чему я научусь в уроке «Срезы»?

Заимствованные представления Ты практикуешь Learn Rust Coding с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Learn Rust Coding?

Предыдущий опыт не требуется. Learn Rust Coding на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Срезы»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Learn Rust Coding?

Да. Каждый урок Learn Rust Coding включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. String и &str
  2. Срезы
  3. Методы строк
  4. UTF-8 и символы
← Назад к Learn Rust Coding