让孩子修改其父母

时间:2015-02-04 14:34:41

标签: rust

我希望有一个子结构修改其父结构。 例如:

// 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);
}

我确定可以使用不安全的块来完成,但还有其他选择吗? 也许我的代码不是惯用的?

1 个答案:

答案 0 :(得分:4)

你得到"已经借来的原因"错误是因为您尝试将Updater传递给update方法两次,一次传递为self,一次嵌入updatee。出于内存安全原因,Rust不允许这样做。

最简单的解决方案是将updateUpdatee中需要更新的字段的引用传递给Updatee而不是整个impl Updater { fn update(&mut self, updatee_value: &mut u64) { self.value = self.value + 1; *updatee_value = self.value; } }

Updatee

如果需要更新多个字段,Updater可以转换为update周围的包装器和另一个包含实际数据字段的结构,可以安全地传递给{{1} }}