如何创建并向Vec<Struct>追加元素?

5
以下代码无法编译:

以下内容无法编译:

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` 

编辑代码,调用对a的引用上的append函数:
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本身。然而,我相信我正在遵循一个包含类型A的元素的Vec的正确创建方式。根据Rust书籍:

To create a new, empty vector, we can call the Vec::new function, as shown in Listing 8-1.

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

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

我已经成功地使用了Vec<String>,使用与我正在尝试的相同的模式,但显然我对某些非常基本的东西存在误解。


4
这是链接:https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.append -- 你要找的函数是push。 - Benjamin Lindley
2
@BenjaminLindley 既然你的评论回答了问题,你介意把它作为一个答案发表吗? - Sven Marnach
谢谢Benjamin Lindley,如果您将此信息作为答案提供,我将非常乐意接受。 - JawguyChooser
请注意,这不是Python数组。在Rust中,append对于Vec有着不同的含义。 - Andrey Tyukin
是的,Andrey Tyukin,我曾经把自己搞糊涂了,因为在我的代码的另一个地方,我故意选择了 append(类似于 Python 的 extend)。但由于我对 Rust 还很陌生,编译器的信息把我引入了错误的方向,所以我决定发帖问问题。如果 Benjamin Lindley 写出答案,我会非常乐意接受它。 - JawguyChooser
1个回答

15
我认为有人在评论中已经说过这个了,但是append通过将另一个向量的所有元素移动到自身中来将它们全部追加到此向量中,我认为你正在尝试将push(a)添加到你的vec中。
详情请见:https://doc.rust-lang.org/rust-by-example/std/vec.html
let mut xs = vec![1i32, 2, 3];
println!("Initial vector: {:?}", xs);

// Insert new element at the end of the vector
println!("Push 4 into the vector");
xs.push(4);
println!("Vector: {:?}", xs);

6
请在您的回答中提供一个工作示例代码,并最好附带文档链接以进一步说明。 - hellow
确实,这个问题已经解决了。我本来希望能把答案的功劳归给@benjamin-lindley,因为他们回答得最早。 - JawguyChooser
工作示例已添加 - Stanley Ko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接