Атрибут Структуры соответствия ржавчины в методе не проверяет заимствование
#[derive(Debug)]
enum E {
Foo(u32),
Bar,
Baz
}
struct S { a: E }
impl S {
fn print(&self) {
match self.a {
E::Foo(a) => println!("{}", a),
e => println!("{:?}", e)
}
}
}
fn main() {
let a = S { a: E::Bar };
a.print();
}
Этот клип не компилируется:
error[E0507]: cannot move out of borrowed content
--> main.rs:11:15
|
11 | match self.a {
| ^^^^ cannot move out of borrowed content
12 | E::Foo(a) => println!("{}", a),
13 | e => println!("{:?}", e)
| - hint: to prevent move, use `ref e` or `ref mut e`
и я более или менее понимаю, почему: self
владеет self.a
и потому что я только позаимствовал self
в объявлении метода я не могу двигаться self.a
снаружи self
, Но я не могу понять, каков лучший способ исправить это. Очевидно, я мог бы использовать ref e => println!("{:?}", e)
в этом надуманном примере, но я ищу более общее описание, где я не могу использовать указатель. Должен ли я копировать self.a
в заявке на матч? Это казалось бы расточительным, если бы был отдельный случай для E::Baz
,