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

1cosmwyk  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(100)

我在写一个简单的构建器。我想让一个builder方法使用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

rta7y2nd

rta7y2nd1#

问题不在于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
}

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

相关问题