首页 文章

Rust实现方法 - 在可变借用方法中借用“getter”方法[重复]

提问于
浏览
1

这个问题在这里已有答案:

请考虑以下示例程序:

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() {

}

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

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

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

我理解它在这里解决的概念;我不明白的是如何解决这个问题 . 实际上,peek不仅仅是读取第0个元素,而且我不想重复写入内部的逻辑;必须有一种方法在Rust中实现它 . 写和窥视使用完全不同的结构成员,因此这里没有竞争条件的可能性 .

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

2 回答

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

相关问题