我有一个结构,称之为Master
,需要有一个slaves
的集合Slave
。添加到Master
后,每个Slave
都需要使用Master
为其分配的唯一ID进行标记。
我目前正在尝试这样做的方式是这样的:
pub struct Master {
slaves: VecMap<Slave>
}
impl Master {
// omitted constructor
// fn get_unique_id(&self) -> usize {...}
pub fn add_slave(&mut self, slave: &mut Slave) {
let new_id = self.get_unique_id();
slave.set_id(new_id);
self.slaves.insert(new_id, *slave);
// Previous line causes "cannot move out of borrowed content" error
}
pub fn get_slave(&self, id: usize) -> Option<&Slave> {
self.slaves.get(&id)
}
}
我应该如何声明从属字段(VecMap
的refs或值)并正确实现这些方法?
答案 0 :(得分:3)
容器包含值。在这种情况下,您正在使用引用(slave: &mut Slave
),然后尝试窃取函数内Slave
的所有权。这是一个很大的禁忌,因为这种方法的调用者不会知道你已经消耗了这个项目。
相反,在添加商品时放弃商品的所有权:
pub fn add_slave(&mut self, slave: Slave) {
let mut slave = slave; // let us mutate it, now that we own it
let new_id = self.get_unique_id();
slave.set_id(new_id);
self.slaves.insert(new_id, slave);
}
我更喜欢接受项目(slave: Slave
),然后在函数体中使其变为可变。这样,该方法的调用者不需要关心实现细节。如果这困扰你,你也可以将参数声明为mut slave: Slave
。
另一种选择是将结构更改为保留&mut Slave
项目,但我的猜测是你想要第一个解决方案。