Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsSpDrCl 48 of 288 menu
◀ ▶

Копия и копирование при записи в 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, }

Скажите, соберется ли программа, если над типом оставить только пометку копирования при записи, и почему.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить