部分的ムーブ
Within the destructuring of a single variable, both by-move
and by-reference
pattern bindings can be used at the same time. Doing this will result in a partial move of the variable, which means that parts of the variable will be moved while other parts stay. In such a case, the parent variable cannot be used afterwards as a whole, however the parts that are only referenced (and not moved) can still be used.
fn main() { #[derive(Debug)] struct Person { name: String, age: Box<u8>, } let person = Person { name: String::from("Alice"), age: Box::new(20), }; // `name` は person からムーブしたが、 `age` は参照されています。 let Person { name, ref age } = person; println!("The person's age is {}", age); println!("The person's name is {}", name); // エラー!部分的ムーブした値の借用:`person` では部分的ムーブが発生しています。 //println!("The person struct is {:?}", person); // `person` は使用できませんが、 // `person.age` はムーブしていないので使用できます。 println!("The person's age from person struct is {}", person.age); }
(In this example, we store the age
variable on the heap to illustrate the partial move: deleting ref
in the above code would give an error as the ownership of person.age
would be moved to the variable age
. If Person.age
were stored on the stack, ref
would not be required as the definition of age
would copy the data from person.age
without moving it.)