@@ -75,6 +75,69 @@ To fix this, ensure that any declared variables are initialized before being
75
75
used.
76
76
"## ,
77
77
78
+ E0382 : r##"
79
+ This error occurs when an attempt is made to use a variable after its contents
80
+ have been moved elsewhere. For example:
81
+
82
+ ```
83
+ struct MyStruct { s: u32 }
84
+
85
+ fn main() {
86
+ let mut x = MyStruct{ s: 5u32 };
87
+ let y = x;
88
+ x.s = 6;
89
+ println!("{}", x.s);
90
+ }
91
+ ```
92
+
93
+ Since `MyStruct` is a type that is not marked `Copy`, the data gets moved out
94
+ of `x` when we set `y`. This is fundamental to Rust's ownership system: outside
95
+ of workarounds like `Rc`, a value cannot be owned by more than one variable.
96
+
97
+ If we own the type, the easiest way to address this problem is to implement
98
+ `Copy` and `Clone` on it, as shown below. This allows `y` to copy the
99
+ information in `x`, while leaving the original version owned by `x`. Subsequent
100
+ changes to `x` will not be reflected when accessing `y`.
101
+
102
+ ```
103
+ #[derive(Copy, Clone)]
104
+ struct MyStruct { s: u32 }
105
+
106
+ fn main() {
107
+ let mut x = MyStruct{ s: 5u32 };
108
+ let y = x;
109
+ x.s = 6;
110
+ println!("{}", x.s);
111
+ }
112
+ ```
113
+
114
+ Alternatively, if we don't control the struct's definition, or mutable shared
115
+ ownership is truly required, we can use `Rc` and `RefCell`:
116
+
117
+ ```
118
+ use std::cell::RefCell;
119
+ use std::rc::Rc;
120
+
121
+ struct MyStruct { s: u32 }
122
+
123
+ fn main() {
124
+ let mut x = Rc::new(RefCell::new(MyStruct{ s: 5u32 }));
125
+ let y = x.clone();
126
+ x.borrow_mut().s = 6;
127
+ println!("{}", x.borrow.s);
128
+ }
129
+ ```
130
+
131
+ With this approach, x and y share ownership of the data via the `Rc` (reference
132
+ count type). `RefCell` essentially performs runtime borrow checking: ensuring
133
+ that at most one writer or multiple readers can access the data at any one time.
134
+
135
+ If you wish to learn more about ownership in Rust, start with the chapter in the
136
+ Book:
137
+
138
+ https://doc.rust-lang.org/book/ownership.html
139
+ "## ,
140
+
78
141
E0384 : r##"
79
142
This error occurs when an attempt is made to reassign an immutable variable.
80
143
For example:
@@ -100,7 +163,6 @@ fn main(){
100
163
}
101
164
102
165
register_diagnostics ! {
103
- E0382 , // use of partially/collaterally moved value
104
166
E0383 , // partial reinitialization of uninitialized structure
105
167
E0385 , // {} in an aliasable location
106
168
E0386 , // {} in an immutable container
0 commit comments