如何创建和附加到Vec <struct>?

时间:2019-01-11 22:36:27

标签: vector struct rust

以下内容无法编译:

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进行正确的创建。从Rust书中:

  

要创建一个新的空向量,我们可以调用Vec::new函数,如下所示:   如清单8-1所示。

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

https://doc.rust-lang.org/book/ch08-01-vectors.html

我已经成功使用Vec<String>并使用了与此处相同的模式,但是我显然误解了一些非常基本的东西。

2 个答案:

答案 0 :(得分:1)

我认为可能有人在评论中说了这一点,但通过将另一矢量的所有元素添加到“自我”中,将其追加到此矢量中,我认为您正在尝试push(a)到您的vec

答案 1 :(得分:0)

如果你和我一样,你实际上想做相反的事情(即阻止 VSCode 自动切换到“调试控制台”选项卡,而不是仅仅停留在“终端选项卡”上),那么我发现解决方案是将此设置添加到您的 launch.json 文件中:

"avoidWindowsConsoleRedirection": true