返回具有生存期的Struct方法的引用



我正在尝试这个代码:

struct ByteIter<'a> {
remainder: &'a mut [u8],
index: usize,
}
impl<'a> ByteIter<'a> {
fn new(remainder: &'a mut [u8]) -> ByteIter<'a> {
ByteIter{remainder, index: 0}
}
fn next(&'a mut self) -> Option<&'a mut u8> {
if self.index >= self.remainder.len() {
None
} else {
let mut byte = &mut self.remainder[self.index];
self.index  += 1;
Some(byte)
}
}
}
fn main() {
let mut a = [ 0x51, 0x52, 0x53, 0x54];
let mut bytes = ByteIter::new(&mut a);
{
let byte_1 = bytes.next();
}
let byte_2 = bytes.next();
}

现在,据我所知,byte_1是从字节借用的。但是它的寿命已经过期了。但是,当我编译它时,我看到以下错误:

29 |     let byte_2 = bytes.next();
|                  ^^^^^
|                  |
|                  second mutable borrow occurs here
|                  first borrow later used here

这里的第一个可变借用是什么?当byte_1超出作用域时,不应该释放它吗?

重要的是,我应该做些什么来解决这个问题?

对于impl<'a> ByteIter<'a>,您声明'a是结构中使用的生命周期,即,它是底层切片的生命周期。

现在,当您说fn next(&'a mut self) -> Option<&'a mut u8> {时,您重用了相同的'a,并且您说它与返回的可变引用相同。你是说返回的生命周期与ByteIter结构体内容相同。

删除额外的生命周期约束,编译器将可以自由地计算适当的生命周期:

fn next(& mut self) -> Option<& mut u8> {
if self.index >= self.remainder.len() {
None
} else {
let mut byte = &mut self.remainder[self.index];
self.index  += 1;
Some(byte)
}
}

最新更新