我正在努力理解一个Rust生命周期问题,感觉自己快疯了。运行以下代码时:
use std::fs::File;
use std::io::Read;
use std::clone::Clone;
const BUFSIZE : usize = 4096;
struct LexBuf<T: Read> {
f: T,
buf: [u8; BUFSIZE],
tail: usize,
head: usize
}
impl <T : Read> LexBuf<T> {
fn fetch(&mut self) {
let keepSize = self.head - self.tail + 1;
let mut tmpBuf;
{
let tmpSlice = &self.buf[self.tail..self.head+1];
tmpBuf = tmpSlice.clone();
}
&mut self.buf[0..keepSize]
.clone_from_slice(tmpBuf);
let mut n = self.f
.read(&mut self.buf[keepSize..]).unwrap();
if n < BUFSIZE - keepSize {
self.buf[keepSize+n] = 0;
}
}
}
我希望tmpSlice
在自己的作用域中,这样我之后就可以借用self.buf
,但似乎借用检查器不同意,因为它说tmpSlice
的借用在fn fetch
作用域结束。
clone
不会创建一个拥有所有权的副本,它只是克隆引用,而不是引用指向的内容。你需要使用to_owned
。 - oli_obk