Как я могу использовать match для изменения изменяемой переменной таким образом, чтобы она гарантированно не была исчерпывающей и не требовала клонирования? - PullRequest
0 голосов
/ 03 декабря 2018

При использовании match для изменения изменяемой переменной я не нашел способа использовать match таким образом, чтобы он гарантированно не был исчерпывающим и не требовал clone.

* 1005.*
error[E0507]: cannot move out of borrowed content
  --> src/main.rs:19:20
   |
19 |         *x = match *x {
   |                    ^^ cannot move out of borrowed content
...
25 |             Bar::SomeStuff(thing) => panic!("not sure"),
   |                            ----- hint: to prevent move, use `ref thing` or `ref mut thing`

Я намереваюсь написать Bar::SomeStuff(thing) => Bar::SomeStuff(thing) и фактически оставить его без изменений, но я не могу перейти с помощью заимствования или ссылки.

Bar::SomeStuff(thing.clone()) может работать, но копирование большой структурыможет быть очень дорого.

Удаление *x = и изменение на () также может работать, но я возвращаю только перечисление Bar, поэтому я надеюсь сохранить компилятор, проверяющий тип возвращаемого значения.

1 Ответ

0 голосов
/ 03 декабря 2018

Если вы хотите передать значение без изменений, просто захватите совпадение с переменной и передайте его обратно, например,

fn foo(a: u32) -> u32 {
    match a {
        0 => 1,
        1 => 2,
        e => e,
    }
}

В вашем случае я бы переместил присвоение переменной в плечи совпадения

for x in things.iter_mut() {
    match x {
        Bar::Nothing => *x = Bar::AlsoNothing,
        Bar::AlsoNothing => *x = Bar::SomeStuff(Stuff { num: 3, thing: true }),
        _ => {},
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...