Копия и копирование при записи в Rust
Иногда нужно получить второе значение с теми же полями, не забирая первое. Трейт явной копии дает метод, который собирает новую структуру по полям. Пометка копии подключает этот метод автоматически, в том числе когда в поле лежит своя строка.
Пометка копии делает явную копию через
метод clone. После присваивания
исходное значение остается на месте, а
новая переменная владеет отдельной строкой:
#[derive(Clone)]
struct User {
name: String,
age: i32,
}
fn main() {
let first = User {
name: String::from("ann"),
age: 20,
};
let second = first.clone();
println!("{} {}", second.name, second.age);
}
Отдельный трейт копирует значение при обычной записи в новую переменную без вызова метода. Пометка копирования при записи работает только если каждое поле само относится к таким типам, например число:
#[derive(Copy, Clone)]
struct Point {
x: i32,
y: i32,
}
fn main() {
let a = Point { x: 1, y: 2 };
let b = a;
println!("{} {}", b.x, b.y);
}
Если в структуре есть поле String,
пометку копирования при записи поставить
нельзя: такая программа не собирается,
компилятор напомнит, что строка не
относится к копируемым при записи типам:
#[derive(Copy)]
struct Holder {
title: String,
}
fn main() {
let h = Holder {
title: String::from("note"),
};
let copy = h;
println!("{}", copy.title);
}
Дана структура:
struct User {
name: String,
age: i32,
}
Подключите только пометку явной копии,
сделайте clone и выведите имя
из копии, не уничтожая исходное значение.
Дана структура:
struct Pair {
a: i32,
b: i32,
}
Добавьте обе пометки копии и копирования при записи, присвойте значение второй переменной и выведите оба числа.
Дана структура:
struct Tag {
label: String,
}
Скажите, соберется ли программа, если над типом оставить только пометку копирования при записи, и почему.