考虑以下示例程序:
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很新,所以如果我遗漏了一些显而易见的东西,或者我有违反的设计模式或最佳实践,我也不会感到惊讶。如果是这样的话,请告诉我。
答案 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);
}