我正在阅读 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 的工作原理(即在对象不存在的情况下访问对象的成员属性,这对我来说听起来有点疯狂)?
所讨论的行是破坏结构的模式。请参阅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
而被移出。