【问题标题】:Rust Implement Methods -- Borrow with "getter" method inside mutable borrow method [duplicate]Rust 实现方法——在可变借用方法中使用“getter”方法借用 [重复]
【发布时间】:2017-01-19 00:15:39
【问题描述】:

考虑以下示例程序:

struct Data {
    output: Vec<u8>,
    array: Vec<u8>
}

impl Data {
    fn peek(&self) -> u8 {
        self.array[0]
    }
    fn write(&mut self) {
        self.output.push(self.peek());
    }
}

fn main() {

}

(忽略方法的命名,在更大的实际实现范围内更有意义)

当我尝试编译这个时,我得到一个错误,我不能从 self 借用 self 而 self 是可变借用的。

test.rs:11:26: 11:30 错误:不能将 *self 借用为不可变,因为 self.output 也被借用为可变的

我理解它在这里所表达的概念;我不明白如何解决这个问题。实际上,peek 不仅仅是读取第零个元素,我不想重复 peek inside write 的逻辑;必须有一种方法可以在 Rust 中实现这一点。写入和窥视使用完全不同的结构成员,因此这里出现竞争条件的可能性为零。

我是 Rust 的新手,所以如果我遗漏了一些明显的东西,或者我违反了设计模式或最佳实践,我不会感到惊讶。如果是这种情况,请告诉我。

【问题讨论】:

    标签: methods struct rust borrow-checker


    【解决方案1】:

    您需要将self.peek() 保存到一个临时文件中

    fn write(&mut self) {
        let tmp = self.peek();
        self.output.push(tmp);
    }
    

    这应该会起作用,因为借用的持续时间不再重叠。

    报错的原因是你的逻辑大致等于:

    let tmp1 = &mut self.output;
    let tmp2 = self.peek();
    Vec<u8>::push(tmp1, tmp2);
    

    这样,借用重叠的原因就更明显了。

    【讨论】:

    • 感谢您的解释。现在我真的觉得很傻!我不敢相信我从未尝试过拆分它!
    【解决方案2】:

    (我确定这是重复的,但我似乎找不到完全匹配的)

    您需要拆分调用:

    fn write(&mut self) {
        let byte = self.peek();
        self.output.push(byte);
    }
    

    【讨论】:

    • 我想也应该有……但我找不到要搜索的神奇关键词。如果你找到它,请随时标记并关闭!
    • “rust mutable borrow argument”仅限于 SO.com
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多