[ОБЯЗАТЕЛЬНО К ПРОСМОТРУ] Rust #14. Концепция владения, ссылки, срезы в Rust. ОБЯЗАТЕЛЬНО знать

YOUTUBE · 19.11.2025 10:07

Ключевые темы и таймкоды

Введение

0:00
  • Приветствие и призыв подписаться на канал.
  • Анонс темы видео: концепция владения в Rust.

Управление памятью в разных языках

0:37
  • Объяснение важности управления памятью в программировании.
  • Примеры языков с сборщиком мусора: Python, Go.
  • Влияние сборщика мусора на производительность.

Управление памятью в C и C++

1:37
  • В C и C++ управление памятью полностью лежит на программисте.
  • Риски неправильного управления памятью в C и C++.
  • Возможные уязвимости и ошибки при неправильном управлении памятью.

Подход Rust к управлению памятью

2:22
  • Rust предлагает эффективный и безопасный подход к управлению памятью через концепцию владения.
  • Владение не замедляет приложение и эффективно использует память.

Стек и куча

3:22
  • Объяснение стека как организованной системы хранения данных в строгом порядке.
  • Процесс записи данных в стек: вталкивание.
  • Процесс извлечения данных из стека: выталкивание.

Стек и куча

3:37
  • Стек: данные удаляются в обратном порядке, размер известен заранее.
  • Куча: объёмные типы данных, размер которых неизвестен, выделение пространства менее эффективно.

Владение значениями

4:37
  • У каждого значения в программе есть только один владелец.
  • Пример: переменная `нам` является владельцем значения `5`.

Область видимости

5:37
  • Переменная действительна только в своей области видимости.
  • При выходе из области видимости переменная и её значение отбрасываются.

Взаимодействие данных в памяти

7:37
  • Пример с целочисленными переменными: копирование значений между переменными.
  • Пример со строковыми переменными: перемещение значений между переменными.

Проблемы с перемещением строк

10:28
  • Строковые переменные хранятся в куче, их перемещение менее эффективно, чем копирование.
  • Перемещение строк приводит к ошибке двойного высвобождения памяти.

Решение проблемы перемещения строк

14:28
  • Для корректного использования строковых переменных необходимо копировать значения.
  • Метод `clone` позволяет клонировать значение переменной.
  • Клонирование значений из кучи требует дополнительных затрат памяти.

Типы данных, хранящиеся в стеке

15:28
  • Целые числа: 8, 32, 64, 128 и т. д.
  • Логический тип: bool.
  • Числа с плавающей точкой: f32 и f64.
  • Символьный тип: char.
  • Кортежи, содержащие типы, хранящиеся в стеке, кроме строк.

Владение в функциях

17:28
  • Строки не копируются, а перемещаются при передаче в функцию.
  • После передачи строки в функцию её исходное значение становится недействительным.
  • Для повторного использования строки можно использовать string.clone.

Передача целых чисел

20:19
  • Целые числа копируются при передаче в функцию, так как хранятся в стеке.
  • Функция не забирает владение значением у основной функции.
  • При завершении области видимости число отбрасывается.

Возврат владения

22:19
  • Функция может возвращать владение строкой, перемещая её в вызывающую функцию.
  • Пример: функция give возвращает строку, передавая владение переменной.

Захват и возврат владения

23:19
  • Функция take_and_give захватывает владение строкой, а затем возвращает её.
  • Строка перемещается между переменными, но не копируется.
  • Важно понимать, как владение работает в функциях.

Использование ссылок

27:19
  • Ссылки позволяют использовать строку в функции без передачи владения.
  • Ссылка на переменную позволяет получить доступ к значению, не перемещая его.
  • Ссылочный тип создаётся с помощью амперсанда.

Введение в ссылки

28:19
  • Амперсант & используется как ссылка-указатель.
  • Пример из документации Rust: возврат длины строки.
  • Передача строки в функцию приводит к потере её значения.

Передача переменной в функцию

29:10
  • При передаче переменной в функцию её значение становится недействительным.
  • Использование ссылок позволяет сохранить значение переменной.
  • Пример с функцией calc: передача ссылки на строку.

Принцип работы ссылок

30:10
  • Функция получает ссылку на переменную типа string и считает её длину.
  • Переменная остаётся действительной, так как функция работает с ссылкой.
  • Без ссылок переменная становится недействительной после передачи в функцию.

Изменяемые ссылки

31:10
  • Для изменения строки используется изменяемая ссылка.
  • Неизменяемая ссылка не может быть изменена.
  • Пример с методом push_string: добавление значения в строку.

Создание изменяемой ссылки

32:10
  • Для создания изменяемой ссылки используется конструкция &mut.
  • Пример с методом readline: передача изменяемой ссылки.
  • Метод readline изменяет строку по ссылке.

Ограничения изменяемых ссылок

36:10
  • В Rust есть ограничения на создание изменяемых ссылок.
  • Создание нескольких изменяемых ссылок на одну переменную приводит к ошибке.
  • Компилятор предотвращает гонки данных и ошибки с памятью.

Неизменяемые ссылки

39:01
  • Неизменяемые ссылки используются для чтения значений.
  • Можно создавать любое количество неизменяемых ссылок.
  • Попытка создать изменяемую и неизменяемую ссылку одновременно приводит к ошибке.

Области видимости

40:01
  • Важно учитывать области видимости при работе с изменяемыми ссылками.
  • Пример с условным оператором и перемещением переменной.
  • Создание новой области видимости для переменной.

Изменяемые ссылки и область видимости

41:01
  • Создание двух изменяемых ссылок в одной области видимости не приводит к ошибкам.
  • Ссылка, созданная в одной области видимости, исчезает при выходе из неё.
  • Нельзя создавать несколько изменяемых ссылок в одной области видимости.

Висящие ссылки

42:01
  • Висящие ссылки — это ссылки на несуществующие данные.
  • Пример с функцией, возвращающей ссылку на строку, показывает проблему висящих ссылок.
  • При выходе переменной из области видимости её значение отбрасывается, но ссылка остаётся.

Решение проблемы висящих ссылок

45:01
  • Для избежания висящих ссылок нужно возвращать не ссылку, а саму строку.
  • Передача владения строкой решает проблему висящих ссылок.

Срезы в Rust

46:01
  • Срез — это ссылочный тип, позволяющий ссылаться на часть строки или массива.
  • Создание среза требует указания позиции в строке или массиве.
  • Интервальный синтаксис позволяет указывать диапазон индексов.

Работа со строковыми срезами

47:01
  • Пример создания среза на строку «текст» показывает, как указать позицию.
  • Пропуск крайних значений в срезе возможен благодаря интервальному синтаксису.
  • Срез на всю строку можно создать, указав индексы от 0 до последнего.

Срезы других типов данных

49:52
  • Создание среза на массив чисел показывает, как работать с неупорядоченной коллекцией.
  • Срезы на массивы работают аналогично строковым срезам.

Заключение

51:52
  • Подведение итогов урока по концепциям владения, ссылкам и срезам в Rust.
  • Призыв задавать вопросы в комментариях или телеграм-канале.
  • Благодарность зрителям и призыв к подписке на канал.