| A value was moved whose size was not known at compile time. | |
| Erroneous code example: | |
| ```compile_fail,E0161 | |
| trait Bar { | |
| fn f(self); | |
| } | |
| impl Bar for i32 { | |
| fn f(self) {} | |
| } | |
| fn main() { | |
| let b: Box<dyn Bar> = Box::new(0i32); | |
| b.f(); | |
| // error: cannot move a value of type dyn Bar: the size of dyn Bar cannot | |
| // be statically determined | |
| } | |
| ``` | |
| In Rust, you can only move a value when its size is known at compile time. | |
| To work around this restriction, consider "hiding" the value behind a reference: | |
| either `&x` or `&mut x`. Since a reference has a fixed size, this lets you move | |
| it around as usual. Example: | |
| ``` | |
| trait Bar { | |
| fn f(&self); | |
| } | |
| impl Bar for i32 { | |
| fn f(&self) {} | |
| } | |
| fn main() { | |
| let b: Box<dyn Bar> = Box::new(0i32); | |
| b.f(); | |
| // ok! | |
| } | |
| ``` |