Rust

#4 – Управление памятью и владение (Ownership)

#4 – Управление памятью и владение (Ownership)

За урок мы научимся получать и обрабатывать данные от пользователя. Также мы ознакомимся с темой управления памяти и владение (Ownership). Вы научитесь обрабатывать введенные данные и передавать значения внутри программы.

Відеоурок

Telegram group

Підписуйтесь на нашу групу в Телеграмі 🇺🇦

Получение данных от пользователя

Чтобы получить данные от пользователя, Rust использует стандартную библиотеку std::io. Вот базовый пример:

use std::io;

fn main() {
	println!("Введите ваше имя:");

	let mut input = String::new(); // создаём изменяемую строку для хранения ввода

	io::stdin()
		.read_line(&mut input) // читаем строку из стандартного ввода
		.expect("Не удалось прочитать строку");

	println!("Здравствуйте, {}!", input.trim()); // выводим введённое имя
}

Ключевые моменты:

  1. String::new() создаёт новую пустую строку.
  2. io::stdin().read_line(&mut input) заполняет строку данными от пользователя.
  3. expect помогает обработать возможные ошибки чтения.
  4. .trim() удаляет лишние пробелы или символы перевода строки.


Концепция Ownership

Ownership — это базовая концепция Rust, которая помогает избегать утечек памяти. Она основывается на трёх правилах:

  1. У каждой переменной есть владелец (owner).
  2. В каждый момент времени у данных может быть либо один владелец, либо несколько ссылок.
  3. Когда владелец выходит из области видимости, данные освобождаются.


Пример владения:

fn main() {
	let s1 = String::from("Привет"); // s1 владеет строкой
	let s2 = s1; // s1 передаёт владение s2

	// println!("{}", s1); // ошибка: s1 больше не владеет данными
	println!("{}", s2); // s2 теперь владеет строкой
}

Здесь переменная s1 передаёт своё владение переменной s2, поэтому s1 становится недействительной.


Ссылки и заимствование

Чтобы не передавать владение, можно использовать ссылки:

fn main() {
	let s1 = String::from("Привет");
	let len = calculate_length(&s1); // передаём ссылку на строку

	println!("Длина '{}': {}", s1, len); // s1 остаётся доступной
}

fn calculate_length(s: &String) -> usize { // принимаем ссылку
	s.len()
}

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


Совместное использование данных

Rust не позволяет одновременно иметь изменяемую и неизменяемую ссылку на данные, что предотвращает гонки данных:

fn main() {
	let mut s = String::from("Привет");

	let r1 = &s; // неизменяемая ссылка
	let r2 = &s; // ещё одна неизменяемая ссылка

	println!("{} и {}", r1, r2);

	// let r3 = &mut s; // ошибка: нельзя создать изменяемую ссылку, пока есть неизменяемые
}

Вихідний код

Весь код буде доступний після підписки на проект!

Завдання до уроку

Необхідно оформити передплату на проект, щоб отримати доступ до всіх домашніх завдань

Велике завдання за курсом

Вам необхідно оформити передплату на сайті, щоб мати доступ до всіх великих завдань. У завдання входить методика рішення, а також готовий проект з відповіддю до завдання.
PS: подібні завдання доступні при підписці від 1 місяця

Також варто подивитися

Уроки React Native для начинающих / Разработка приложения с нуля
11 уроків
Доповнена реальність / Створення Unity AR додатків
Изучение Flask / Создание сайта на Python
6 уроків
Разработка на Android Studio / Приложение E-Commerce
9 уроків
Изучение PyQt5 / Графический интерфейс на Python
6 уроків
Вивчення C++ від новачка до профі
Коментарі
Додати коментар

Поки що коментарів немає