Rust实现方法 - 在可变借用方法中借用“getter”方法

时间:2017-01-19 00:15:40

标签: methods struct rust borrow-checker

考虑以下示例程序:

MyApp/
MyApp/build
MyApp/src 
MyApp/WebContent
MyApp/WebContent/META-INF
MyApp/WebContent/WEB-INF
MyApp/WebContent/WEB-INF/lib

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

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

  

test.rs:11:26:11:30错误:无法借用--2017-01-19 11:02:30-- http://<masterhost>:19000/ Reusing existing connection to <masterhost>:19000. HTTP request sent, awaiting response... 307 Temporary Redirect Location: / [following] 作为不可变因为   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() { } 也被借用为可变

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

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

2 个答案:

答案 0 :(得分:2)

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

通过这种方式,借用重叠的原因更为明显。

答案 1 :(得分:1)

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

您需要拆分呼叫:

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