Error code E0505
A value was moved out while it was still borrowed.
Erroneous code example:
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 section of the Book.