Атрибут Структуры соответствия ржавчины в методе не проверяет заимствование

#[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,

0 ответов

Другие вопросы по тегам