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

Часткові переміщення

Під час [деструктуризації] однієї змінної обидва прив’язування зразка by-move і by-reference можуть використовуватися одночасно. Це призведе до часткового переміщення змінної, що означає , що частини змінної будуть переміщені, тоді як інші частини залишаться. У такому випадку батьківську змінну не можна буде використовувати після цього як ціле, однак частини, на які лише посилаються (і які не переміщено), ще можна використовувати. Зверніть увагу, що типи, які реалізують Drop trait, не можуть бути частково переміщені, тому що його метод drop після цього використав би його як ціле.

fn main() {
    #[derive(Debug)]
    struct Person {
        name: String,
        age: Box<u8>,
    }

    // Error! cannot move out of a type which implements the `Drop` trait
    //impl Drop for Person {
    //    fn drop(&mut self) {
    //        println!("Dropping the person struct {:?}", self)
    //    }
    //}
    // TODO ^ Try uncommenting these lines

    let person = Person {
        name: String::from("Alice"),
        age: Box::new(20),
    };

    // `name` is moved out of person, but `age` is referenced
    let Person { name, ref age } = person;

    println!("The person's age is {}", age);

    println!("The person's name is {}", name);

    // Error! borrow of partially moved value: `person` partial move occurs
    //println!("The person struct is {:?}", person);

    // `person` cannot be used but `person.age` can be used as it is not moved
    println!("The person's age from person struct is {}", person.age);
}

(У цьому прикладі ми зберігаємо змінну age у купі, щоб проілюструвати часткове переміщення: видалення ref у наведеному вище коді дало б помилку, оскільки володіння person.age було б переміщено до змінної age. Якби Person.age зберігалося в стеці, ref не було б потрібно, оскільки визначення age скопіювало б дані з person.age без переміщення їх.)

Див. також:

деструктуризації