File tree 2 files changed +41
-0
lines changed
2 files changed +41
-0
lines changed Original file line number Diff line number Diff line change 116
116
- [ RAII] ( scope/raii.md )
117
117
- [ Ownership and moves] ( scope/move.md )
118
118
- [ Mutability] ( scope/move/mut.md )
119
+ - [ Partial moves] ( scope/move/partial_move.md )
119
120
- [ Borrowing] ( scope/borrow.md )
120
121
- [ Mutability] ( scope/borrow/mut.md )
121
122
- [ Aliasing] ( scope/borrow/alias.md )
Original file line number Diff line number Diff line change
1
+ # Partial moves
2
+
3
+ Pattern bindings can have ` by-move ` and ` by-reference ` bindings at
4
+ the same time which is used in [ destructuring] . Using these pattern
5
+ will result in partial move for the variable, which means that part
6
+ of the variable is moved while other parts stayed. In this case, the
7
+ parent variable cannot be used afterwards as a whole. However, parts
8
+ of it that are referenced and not moved can be used.
9
+
10
+ ``` rust,editable
11
+ fn main() {
12
+ #[derive(Debug)]
13
+ struct Person {
14
+ name: String,
15
+ age: u8,
16
+ }
17
+
18
+ let person = Person {
19
+ name: String::from("Alice"),
20
+ age: 20,
21
+ };
22
+
23
+ // `name` is moved out of person, but `age` is referenced
24
+ let Person { name, ref age } = person;
25
+
26
+ println!("The person's age is {}", age);
27
+
28
+ println!("The person's name is {}", name);
29
+
30
+ // Error! borrow of partially moved value: `person` partial move occurs
31
+ //println!("The person struct is {:?}", person);
32
+
33
+ // `person` cannot be used but `person.age` can be used as it is not moved
34
+ println!("The person's age from person struct is {}", person.age);
35
+ }
36
+ ```
37
+ ### See also:
38
+ [ destructuring] [ destructuring ]
39
+
40
+ [ destructuring ] : ../../flow_control/match/destructuring.md
You can’t perform that action at this time.
0 commit comments