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

How to call Vec<>::append() for a moved Vec<> argument?

我正在编写一个简单的构建器。我想让构建器方法使用 self,还使用 ​​Vec<Node> 并将其附加到 self 已经拥有的 Vec<Node>

我有这个方法:

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

nodes 是非引用,因为我想使用它,它是 mut,因为 Vec<>::append() 改变了它的参数。

问题是,我得到:

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

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

问题不是 nodes 不可变,您还需要显式传递一个可变引用给它:

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

你也可以避免可变性:

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

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