如何为移动的 Vec<> 参数调用 Vec<>::append()?

Vic*_*nko 3 move rust

我正在编写一个简单的构建器。我想有一个建设者方法消耗self,同时也消耗Vec<Node>并追加到一个Vec<Node>self已经拥有。

我有这个方法:

pub fn with_nodes(mut self, mut nodes: Vec<Node>) -> Graph {
    self.nodes.append(&nodes);
    self
}
Run Code Online (Sandbox Code Playgroud)

nodes是一个非引用,因为我想使用它,这是mut因为Vec<>::append()它的参数发生了变异。

问题是,我得到:

46 |             self.nodes.append(&nodes);
   |                               ^^^^^^ types differ in mutability
   |
   = note: expected mutable reference `&mut Vec<Node>`
                      found reference `&Vec<Node>`
Run Code Online (Sandbox Code Playgroud)

为什么它nodes是不可变的,因为它被明确标记mut?我还能如何使参数成为局部可变的Vec

orl*_*rlp 7

问题不在于它nodes是不可变的,您还需要显式地将可变引用传递给它:

pub fn with_nodes(mut self, mut nodes: Vec<Node>) -> Graph {
    self.nodes.append(&mut nodes);
    self
}
Run Code Online (Sandbox Code Playgroud)

您还可以避免可变性:

pub fn with_nodes(mut self, nodes: Vec<Node>) -> Graph {
    self.nodes.extend(nodes.drain());
    self
}
Run Code Online (Sandbox Code Playgroud)

另一个提示,不是在返回类型中重复类型名称,您可以使用Self代替Graph。这使得重构更容易。