Rust 实现方法——在可变借用方法中使用 "getter" 方法借用

Rust Implement Methods -- Borrow with "getter" method inside mutable borrow method

考虑以下示例程序:

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 是可变借用的。

test.rs:11:26: 11:30 error: cannot borrow *self as immutable because self.output is also borrowed as mutable

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

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

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

您需要将通话分开:

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

您需要将 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);

这样就更清楚为什么借用重叠了。