Трейт Clone
Трейт Clone позволяет явно создавать
глубокую копию значения. В отличие от трейта
Copy, который работает неявно для простых
типов, Clone требует явного вызова метода
clone. Это полезно, когда нужно сохранить
исходное значение и при этом получить его
независимую копию. Параметров метод clone
не принимает, а возвращает новое значение того
же типа.
Синтаксис
value.clone()
Пример
Давайте склонируем строку "abcde" и
убедимся, что оригинал остался доступен:
fn main()
{
let original = String::from("abcde");
let cloned = original.clone();
println!("{}", original);
println!("{}", cloned);
}
Результат выполнения кода:
"abcde"
"abcde"
Пример
Давайте склонируем вектор и изменим копию, чтобы убедиться в независимости данных:
fn main()
{
let mut original = vec![1, 2, 3, 4, 5];
let mut cloned = original.clone();
cloned.push(6);
println!("{:?}", original);
println!("{:?}", cloned);
}
Результат выполнения кода:
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6]
Пример
Давайте реализуем трейт Clone для
собственной структуры:
#[derive(Clone)]
struct Point
{
x: i32,
y: i32,
}
fn main()
{
let p1 = Point { x: 1, y: 2 };
let p2 = p1.clone();
println!("{} {}", p1.x, p1.y);
println!("{} {}", p2.x, p2.y);
}
Результат выполнения кода:
1 2
1 2