我正在编写一个简单的构建器。我想有一个建设者方法消耗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
?
问题不在于它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
。这使得重构更容易。