我正在try 实现一个简单的文件链.不幸的是,我对BufRead::fill_buf
的实现产生了一个borrow 判断器错误.
impl BufRead for FileChain {
fn fill_buf(&mut self) -> io::Result<&[u8]> {
loop {
let buf = self.stream.fill_buf()?;
if !buf.is_empty() {
return Ok(buf);
} if let Some(filename) = self.future_files.pop() {
self.stream = BufReader::new(File::open(&filename)?);
} else {
return Ok(&[])
}
}
}
}
error[E0506]: cannot assign to `self.stream` because it is borrowed
40 | fn fill_buf(&mut self) -> io::Result<&[u8]> {
| - let's call the lifetime of this reference `'1`
41 | loop {
42 | let buf = self.stream.fill_buf()?;
| ---------------------- `self.stream` is borrowed here
43 | if !buf.is_empty() {
44 | return Ok(buf);
| ------- returning this value requires that `self.stream` is borrowed for `'1`
45 | } if let Some(filename) = self.future_files.pop() {
46 | self.stream = BufReader::new(File::open(&filename)?);
| ^^^^^^^^^^^ `self.stream` is assigned to here but it was already borrowed
您可以找到完整的类定义here(56行).
我认为这类似于已知的borrow 判断器问题,描述了here、here和here.
基本上,检验者认为buf
个引用阻止stream
改变.但是,return buf
和stream
更新不能同时进行.
现有的解决方案(例如从here开始)不能在这里应用,因为我没有HashMap/Vector,而且我受BufRead
个API的限制.我也不能使用Polonius,因为我只能使用稳定的功能.
我的问题是:是否有可能在不牺牲速度的情况下使用安全代码修改此代码?如果这是不可能的,有没有办法覆盖borrow 判断器使用不安全的代码?