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);
这样就更清楚为什么借用重叠了。
考虑以下示例程序:
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 becauseself.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);
这样就更清楚为什么借用重叠了。