#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 місяця
Також варто подивитися