| #### Note: this error code is no longer emitted by the compiler. |
| |
| This error occurs when an attempt is made to move a borrowed variable into a |
| closure. |
| |
| Erroneous code example: |
| |
| ```compile_fail |
| struct FancyNum { |
| num: u8, |
| } |
| |
| fn main() { |
| let fancy_num = FancyNum { num: 5 }; |
| let fancy_ref = &fancy_num; |
| |
| let x = move || { |
| println!("child function: {}", fancy_num.num); |
| // error: cannot move `fancy_num` into closure because it is borrowed |
| }; |
| |
| x(); |
| println!("main function: {}", fancy_ref.num); |
| } |
| ``` |
| |
| Here, `fancy_num` is borrowed by `fancy_ref` and so cannot be moved into |
| the closure `x`. There is no way to move a value into a closure while it is |
| borrowed, as that would invalidate the borrow. |
| |
| If the closure can't outlive the value being moved, try using a reference |
| rather than moving: |
| |
| ``` |
| struct FancyNum { |
| num: u8, |
| } |
| |
| fn main() { |
| let fancy_num = FancyNum { num: 5 }; |
| let fancy_ref = &fancy_num; |
| |
| let x = move || { |
| // fancy_ref is usable here because it doesn't move `fancy_num` |
| println!("child function: {}", fancy_ref.num); |
| }; |
| |
| x(); |
| |
| println!("main function: {}", fancy_num.num); |
| } |
| ``` |
| |
| If the value has to be borrowed and then moved, try limiting the lifetime of |
| the borrow using a scoped block: |
| |
| ``` |
| struct FancyNum { |
| num: u8, |
| } |
| |
| fn main() { |
| let fancy_num = FancyNum { num: 5 }; |
| |
| { |
| let fancy_ref = &fancy_num; |
| println!("main function: {}", fancy_ref.num); |
| // `fancy_ref` goes out of scope here |
| } |
| |
| let x = move || { |
| // `fancy_num` can be moved now (no more references exist) |
| println!("child function: {}", fancy_num.num); |
| }; |
| |
| x(); |
| } |
| ``` |
| |
| If the lifetime of a reference isn't enough, such as in the case of threading, |
| consider using an `Arc` to create a reference-counted value: |
| |
| ``` |
| use std::sync::Arc; |
| use std::thread; |
| |
| struct FancyNum { |
| num: u8, |
| } |
| |
| fn main() { |
| let fancy_ref1 = Arc::new(FancyNum { num: 5 }); |
| let fancy_ref2 = fancy_ref1.clone(); |
| |
| let x = thread::spawn(move || { |
| // `fancy_ref1` can be moved and has a `'static` lifetime |
| println!("child thread: {}", fancy_ref1.num); |
| }); |
| |
| x.join().expect("child thread should finish"); |
| println!("main thread: {}", fancy_ref2.num); |
| } |
| ``` |