Rust

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

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

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

Видеоурок

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

Чтобы получить данные от пользователя, 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 месяца

Также стоит посмотреть

Уроки Java для начинающих
21 урок
Изучение технологии Bootstrap (верстка сайта)
16 уроков
Разработка Android программы. Создание чата
6 уроков
Изучение C# WPF на практике. Создание программ на C#
10 уроков
Изучение C++ от новичка до профи
Курс Nuxt JS / Изучение Nuxt.js фреймворка
8 уроков
Комментарии
Добавить комментарий

Пока комментариев нет