| A value was moved out while it was still borrowed. | |
| Erroneous code example: | |
| ```compile_fail,E0505 | |
| struct Value {} | |
| fn borrow(val: &Value) {} | |
| fn eat(val: Value) {} | |
| fn main() { | |
| let x = Value{}; | |
| let _ref_to_val: &Value = &x; | |
| eat(x); | |
| borrow(_ref_to_val); | |
| } | |
| ``` | |
| Here, the function `eat` takes ownership of `x`. However, | |
| `x` cannot be moved because the borrow to `_ref_to_val` | |
| needs to last till the function `borrow`. | |
| To fix that you can do a few different things: | |
| * Try to avoid moving the variable. | |
| * Release borrow before move. | |
| * Implement the `Copy` trait on the type. | |
| Examples: | |
| ``` | |
| struct Value {} | |
| fn borrow(val: &Value) {} | |
| fn eat(val: &Value) {} | |
| fn main() { | |
| let x = Value{}; | |
| let ref_to_val: &Value = &x; | |
| eat(&x); // pass by reference, if it's possible | |
| borrow(ref_to_val); | |
| } | |
| ``` | |
| Or: | |
| ``` | |
| struct Value {} | |
| fn borrow(val: &Value) {} | |
| fn eat(val: Value) {} | |
| fn main() { | |
| let x = Value{}; | |
| let ref_to_val: &Value = &x; | |
| borrow(ref_to_val); | |
| // ref_to_val is no longer used. | |
| eat(x); | |
| } | |
| ``` | |
| Or: | |
| ``` | |
| #[derive(Clone, Copy)] // implement Copy trait | |
| struct Value {} | |
| fn borrow(val: &Value) {} | |
| fn eat(val: Value) {} | |
| fn main() { | |
| let x = Value{}; | |
| let ref_to_val: &Value = &x; | |
| eat(x); // it will be copied here. | |
| borrow(ref_to_val); | |
| } | |
| ``` | |
| For more information on Rust's ownership system, take a look at the | |
| [References & Borrowing][references-and-borrowing] section of the Book. | |
| [references-and-borrowing]: https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html |