Rust 部分移动语法

问题描述 投票:0回答:1

我正在阅读 rust-by-example 中的官方示例

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

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

    // `name` is moved out of person, but `age` is referenced
    // **What is this syntax here and why does it work? 
    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);
}

这行代码:

let Person { name, ref age } = person;

让我措手不及;我明白了,

let person_a = Person {name: String::from("Bob"), age: Box::new(30)}
,

并且,

let moved_person_a = person_a
.

那行代码对我来说看起来很陌生。

其次,我们直接访问

age
name
,就好像我们直接在
main
的范围内定义它们一样。这和上面那行代码有什么关系吗?或者这就是 Rust 的工作原理(即在对象不存在的情况下访问对象的成员属性,这对我来说听起来有点疯狂)?

rust move
1个回答
0
投票

所讨论的行是破坏结构的模式。请参阅https://doc.rust-lang.org/book/ch18-03-pattern-syntax.html#destructuring-structs

它创建两个变量

name
age
并用
person.name
person.age
初始化它们。由于
ref
,年龄变量将具有
&Box<u8>
类型并指向
person.age

此时,由于

person
的移动,结构体
person.name
已部分移出,因此您无法再使用它。但您仍然可以使用
person.age
,因为这并没有因为
ref
而被移出。

© www.soinside.com 2019 - 2024. All rights reserved.