如何声明和实现一个跟踪结构集合的结构?

时间:2015-01-23 23:39:07

标签: rust

我有一个结构,称之为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或值)并正确实现这些方法?

1 个答案:

答案 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项目,但我的猜测是你想要第一个解决方案。