Как я могу создать и добавить Vec <Struct>? - PullRequest
0 голосов
/ 12 января 2019

Следующее не компилируется:

struct A {
    f: u16,
}

fn main() {
    let v: Vec<A> = Vec::new();
    let a = A { f: 42 };
    v.append(a);
}

Но сообщение компилятора, похоже, ведет меня по неверному пути:

error[E0308]: mismatched types
 --> src/main.rs:8:14
  |
8 |     v.append(a);
  |              ^ expected mutable reference, found struct `A`
  |
  = note: expected type `&mut std::vec::Vec<A>`
             found type `A` 

Редактирование кода для вызова append по ссылке на a:

v.append(&mut a);

Также не компилируется, но с неожиданным (для меня) сообщением:

error[E0308]: mismatched types
 --> src/main.rs:8:18
  |
8 |         v.append(&mut a);
  |                  ^^^^^^ expected struct `std::vec::Vec`, found struct `A`
  |
  = note: expected type `&mut std::vec::Vec<A>`
             found type `&mut A`

Разве append не должен искать элемент Vec? Кажется, он ищет Vec сам. Тем не менее, я полагаю, что я следую за правильным созданием для Vec элементов типа A. Из книги Руст:

Чтобы создать новый пустой вектор, мы можем вызвать функцию Vec::new, так как показано в Перечислении 8-1.

let v: Vec<i32> = Vec::new();

(https://doc.rust -lang.org / книга / ch08-01-vectors.html )

Я успешно использовал Vec<String>, используя ту же схему, что и здесь, но я явно неправильно понимаю что-то совершенно фундаментальное.

1 Ответ

0 голосов
/ 12 января 2019

Я думаю, что кто-то, возможно, сказал это в комментариях, но append добавляет все элементы другого вектора в этот, перемещая их в Self, я думаю, что вы пытаетесь push(a) на свой vec

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