这个问题在这里已有答案:
请考虑以下示例程序:
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 回答
您需要将
self.peek()
保存到临时这应该起作用,因为借用的持续时间不再重叠 .
出错的原因是您的逻辑大致等于:
通过这种方式,借用重叠的原因更为明显 .
(我确定这是重复但我似乎无法找到一个完全匹配的)
您需要拆分呼叫: