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