Владение ownership
Владение ownership - это ключевая система в Rust, обеспечивающая безопасность памяти без сборщика мусора. Каждое значение в Rust имеет ровно одного владельца. Когда владелец выходит из области видимости, значение автоматически освобождается. Передача владения происходит при присваивании или передаче значения в функцию. Параметром здесь выступает само значение, которое перемещается от одного владельца к другому.
Синтаксис
let owner = value;
// owner становится владельцем value
Пример
Давайте создадим переменную s, которая владеет строкой, и передадим владение переменной s2:
fn main()
{
let s = String::from("abcde");
let s2 = s;
println!("{}", s2);
}
Результат выполнения кода:
"abcde"
Пример
После передачи владения переменная s больше не может использоваться. Давайте попробуем обратиться к ней:
fn main()
{
let s = String::from("abcde");
let s2 = s;
println!("{}", s);
}
Компилятор выдаст ошибку, так как владение уже перемещено в s2:
error[E0382]: borrow of moved value: `s`
Пример
Владение также передаётся при вызове функции. Давайте передадим строку в функцию take_ownership:
fn take_ownership(s: String)
{
println!("{}", s);
}
fn main()
{
let s = String::from("12345");
take_ownership(s);
}
Результат выполнения кода:
"12345"
Пример
Если тип реализует трейт Copy, то владение не перемещается, а копируется. Давайте рассмотрим это на примере целых чисел:
fn main()
{
let x = 5;
let y = x;
println!("x = {}, y = {}", x, y);
}
Результат выполнения кода:
x = 5, y = 5
Смотрите также
-
оператор
move,
который перемещает владение значением -
трейт
Copy,
который позволяет копировать значение вместо перемещения -
метод
clone,
который создаёт глубокую копию значения -
механизм
заимствования,
который позволяет использовать значение без передачи владения