Если кратко: ownership и borrowing — это механизм управления памятью в Rust без сборщика мусора. Именно он делает язык одновременно быстрым, безопасным и предсказуемым.
Что такое Ownership
В Rust у каждого значения есть владелец — переменная, которая отвечает за данные в памяти.
Главные правила:
- у каждого значения только один владелец
- в один момент времени владелец может быть только один
- когда владелец выходит из области видимости, память автоматически освобождается
Пример логики:
let s = String::from("hello");
let t = s;После let t = s; переменная s больше недоступна. В Rust это не копирование, а перемещение владения (move).
Так язык защищает от двойного освобождения памяти и висячих указателей.
Почему это важно
В C/C++ ошибки работы с памятью часто приводят к утечкам, segmentation fault и неопределённому поведению.
В Java, Python и Go память контролирует GC, но это добавляет накладные расходы.
Rust предлагает другой путь:
- безопасность памяти на этапе компиляции 🔒
- отсутствие GC
- производительность, близкую к C/C++
Что такое Borrowing
Чтобы не передавать владение каждый раз, Rust позволяет брать данные в долг — по ссылке.
Есть два типа заимствования:
- Неизменяемое:
&T
Можно читать данные, но нельзя менять. - Изменяемое:
&mut T
Можно менять данные, но только при строгих ограничениях.
Пример:
fn len(s: &String) -> usize {
s.len()
}Функция получает ссылку на строку, но не становится её владельцем. После вызова исходная переменная остаётся доступной.
Главное правило Borrowing
Rust не разрешает одновременно:
- несколько изменяемых ссылок
- изменяемую и неизменяемую ссылку на одни и те же данные
Это предотвращает гонки данных ещё до запуска программы ⚙️
Пример:
let mut s = String::from("hi");
let r1 = &s;
let r2 = &mut s; // ошибкаПока существует r1, создать r2 нельзя.
Зачем нужен Lifetimes
Иногда компилятору нужно понять, как долго живут ссылки. Для этого в Rust есть lifetime-аннотации.
Они не меняют время жизни объектов, а лишь помогают описать связи между ссылками. Это особенно важно при возврате ссылок из функций 🧠
Почему новички спотыкаются об эту концепцию
Ownership кажется непривычным, потому что заставляет думать не только о логике программы, но и о том:
- кто владеет данными
- кто временно использует их
- когда данные будут уничтожены
Но после освоения приходит главное преимущество Rust: код становится гораздо надёжнее по умолчанию 🚀
Вывод
Ownership и Borrowing — это фундамент Rust.
Они позволяют писать системный код без типичных ошибок управления памятью, сохраняя высокую скорость работы.
Если понимать эти две идеи, становится проще разбираться во всём остальном: references, slices, lifetimes, struct, async и многопоточности.
👀 Ниже стоит посмотреть подборку каналов про IT — там много полезного по Rust, backend, DevOps и системному программированию.