Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Clone

Глубокое копирование типа или дублирование умного разделяемого указателя.

Можно получить через derive: ✅

// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0

use std::collections::BTreeSet;
use std::rc::Rc;

#[derive(Clone)]
pub struct LotsOfData {
    string: String,
    vec: Vec<u8>,
    set: BTreeSet<u8>,
}

fn main() {
    let lots_of_data = LotsOfData {
        string: "String".to_string(),
        vec: vec![1; 255],
        set: BTreeSet::from_iter([1, 2, 3, 4, 5, 6, 7, 8]),
    };

    // Глубокое копирование всех данных в `lots_of_data`.
    let lots_of_data_cloned = lots_of_data.clone();

    let reference_counted = Rc::new(lots_of_data);

    // Копирует указатель с подсчётом ссылок, а не значение.
    let reference_copied = reference_counted.clone();
}
  • «Глубоко скопировать» значение или, в случае указателей с подсчётом ссылок, таких как Rc/Arc, создать новый экземпляр этого указателя.

  • Когда не реализовывать или не получать через derive: для типов, у которых для сохранения инварианта значение не должно дублироваться. Мы коснёмся этого позже в идиоматичном Rust.