#4 – Управление памятью и владение (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()); // выводим введённое имя
}Ключевые моменты:
String::new()создаёт новую пустую строку.io::stdin().read_line(&mut input)заполняет строку данными от пользователя.expectпомогает обработать возможные ошибки чтения..trim()удаляет лишние пробелы или символы перевода строки.
Концепция Ownership
Ownership — это базовая концепция Rust, которая помогает избегать утечек памяти. Она основывается на трёх правилах:
- У каждой переменной есть владелец (owner).
- В каждый момент времени у данных может быть либо один владелец, либо несколько ссылок.
- Когда владелец выходит из области видимости, данные освобождаются.
Пример владения:
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 месяца
Также стоит посмотреть