Ve c несоответствие изменчивости после сбора - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть следующее:

fn main() {
    let foo = vec![];
    let mut bar = vec![1, 2].iter().map(|a| a + 1).collect::<Vec<_>>();
    foo.append(&bar);
}

Когда я запускаю фрагмент кода, Rust жалуется на bar не изменяемость:

error[E0308]: mismatched types
 --> src/main.rs:4:16
  |
4 |     foo.append(&bar);
  |                ^^^^ types differ in mutability
  |
  = note: expected mutable reference `&mut std::vec::Vec<_>`
                     found reference `&std::vec::Vec<_>`

Как я понимаю, мне нужно иметь изменяемую ссылку на Vec, который я пытаюсь добавить, так как сигнатура типа для Vec::append равна:

fn append(&mut self, other: &mut Vec<T>)

Однако это Мне кажется, что bar должно быть изменяемым согласно предоставленному ключевому слову.

Можно ли добавить после вызова collect? Что здесь происходит?

Ответы [ 2 ]

4 голосов
/ 20 апреля 2020

bar действительно изменчив, но в следующей строке оно неизменно заимствовано у &bar. Вы можете исправить эту ошибку, написав

foo.append(&mut bar);
0 голосов
/ 20 апреля 2020

После некоторого копания:

Черта AsMut реализована на Vec<T>, поэтому можно явно вызвать as_mut:

... collect::<Vec<_>>().as_mut();

Неясно, зачем это нужно, но это решает насущную проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...