gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:25:42 25 4
gpt4 key购买 nike

我有一个结构,称它为 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 of refs or values)并正确实现这些方法?

最佳答案

容器包含值。在这种情况下,您正在获取一个引用 ( 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项目,但我猜你想要第一个解决方案。

关于rust - 如何声明和实现一个跟踪结构集合的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28120483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com