我希望有一个子结构修改其父结构。 例如:
// Problem: Having a struct's field modify the struct in which the field is.
// MUST NOT be copyable nor clonable
struct Updatee {
value: u64,
updater: Updater
}
impl Updatee {
fn update(&mut self) {
// ERROR: cannot borrow `*self` as mutable more than once at a time
self.updater.update(self);
}
}
// MUST NOT be copyable nor clonable
struct Updater {
value: u64
}
impl Updater {
fn update(&mut self, updatee: &mut Updatee) {
self.value = self.value + 1;
updatee.value = self.value;
}
}
fn main() {
let updater = Updater { value: 0 };
let updatee = Updatee { value: 0, updater: updater };
updatee.update();
updatee.update();
assert_eq!(2, updatee.value);
}
我确定可以使用不安全的块来完成,但还有其他选择吗? 也许我的代码不是惯用的?
答案 0 :(得分:4)
你得到"已经借来的原因"错误是因为您尝试将Updater
传递给update
方法两次,一次传递为self
,一次嵌入updatee
。出于内存安全原因,Rust不允许这样做。
最简单的解决方案是将update
对Updatee
中需要更新的字段的引用传递给Updatee
而不是整个impl Updater {
fn update(&mut self, updatee_value: &mut u64) {
self.value = self.value + 1;
*updatee_value = self.value;
}
}
:
Updatee
如果需要更新多个字段,Updater
可以转换为update
周围的包装器和另一个包含实际数据字段的结构,可以安全地传递给{{1} }}