Частичное перемещение
Частичное перемещение - это механизм в Rust, который позволяет переместить владение отдельными полями структуры, не перемещая всю структуру целиком. После частичного перемещения оставшиеся поля структуры всё ещё можно использовать, однако саму структуру как единое целое использовать уже нельзя. Это возможно благодаря тому, что компилятор отслеживает состояние каждого поля отдельно.
Синтаксис
let value = instance.field;
Пример
Давайте создадим структуру с двумя полями типа String
и переместим одно из полей в отдельную переменную:
struct Data
{
first: String,
second: String,
}
fn main()
{
let data = Data {
first: String::from("abcde"),
second: String::from("12345"),
};
let moved = data.first;
let remaining = data.second;
println!("{}", moved);
println!("{}", remaining);
}
Результат выполнения кода:
"abcde"
"12345"
Пример
Давайте попробуем использовать всю структуру после частичного перемещения одного из её полей:
struct Data
{
first: String,
second: String,
}
fn main()
{
let data = Data {
first: String::from("abcde"),
second: String::from("12345"),
};
let moved = data.first;
println!("{}", data.second);
println!("{}", moved);
}
Результат выполнения кода:
"12345"
"abcde"
Здесь мы обращаемся к полю data.second, которое не было
перемещено, поэтому код успешно компилируется. А вот попытка
использовать data.first после перемещения привела бы
к ошибке компиляции.
Пример
Давайте рассмотрим пример, в котором после частичного перемещения делается попытка использовать всю структуру целиком:
struct Data
{
first: String,
second: String,
}
fn main()
{
let data = Data {
first: String::from("abcde"),
second: String::from("12345"),
};
let moved = data.first;
println!("{}", data.second);
println!("{}", moved);
}
Результат выполнения кода:
"12345"
"abcde"