Methods 除锈工具方法——借用“除锈工具”;“吸气剂”;可变借用方法中的方法

Methods 除锈工具方法——借用“除锈工具”;“吸气剂”;可变借用方法中的方法,methods,struct,rust,borrow-checker,Methods,Struct,Rust,Borrow Checker,考虑以下示例程序: struct数据{ 输出:Vec, 数组:Vec } impl数据{ fn窥视(和自)->u8{ self.array[0] } fn写入(&M自我){ self.output.push(self.peek()); } } fn main(){ } (忽略方法的命名;它在实际实现的更大范围内更有意义) 当我试图编译它时,我得到一个错误,当self被可变地借用时,我不能借用self test.rs:11:26:11:30错误:无法借用*self作为不可变项,因为 self.o

考虑以下示例程序:

struct数据{
输出:Vec,
数组:Vec
}
impl数据{
fn窥视(和自)->u8{
self.array[0]
}
fn写入(&M自我){
self.output.push(self.peek());
}
}
fn main(){
}
(忽略方法的命名;它在实际实现的更大范围内更有意义)

当我试图编译它时,我得到一个错误,当self被可变地借用时,我不能借用self

test.rs:11:26:11:30错误:无法借用
*self
作为不可变项,因为
self.output
也作为可变项借用

我理解它在这里提出的概念;我不明白的是如何避开这件事。实际上,peek不仅仅是读取第0个元素,我不想在write中重复peek的逻辑;必须有一种方法来实现这一点。Write和peek使用完全不同的结构成员,因此这里没有竞争条件的可能性

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

(我确定这是一个副本,但我似乎找不到完全匹配的副本)

您需要将通话分开:

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);
让tmp1=&mut self.output;
设tmp2=self.peek();
Vec::push(tmp1,tmp2);

这样一来,借款重叠的原因就更加明显了。

我想也应该有。。。但是我找不到可以搜索的神奇关键词。如果您找到它,请随时标记并关闭!“rust可变借用参数”仅限于SO.com谢谢您的解释。现在我觉得自己真的很笨!真不敢相信我从没试过把它分开!