rust 在具有可变生存期的结构上实现迭代器时出错

kwvwclae  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(178)

我试图在一个复杂的结构体上实现一个迭代器,为此我决定使用一个支持结构,它指向原始的结构体。我写了引用迭代器的代码,它可以工作。但是如果我写同样的代码给一个可变引用,它就不工作了,奇怪的是这个错误似乎和生存期有关。而不是所有权
下面是迭代引用的代码,它可以工作:

struct Iter<'a>{
    vec: &'a i32// i32 is just an example, assume is a more complex strict
}
impl<'a> Iterator for Iter<'a>{
    type Item = &'a i32;
    fn next(&mut self) -> Option<Self::Item> {
        Option::Some(self.vec)//assume this actually iterate over something, again... is just an example
    }
}

下面是相同的代码,但引用是可变的,并且不能编译:

struct IterMut<'a>{
    vec: &'a mut i32
}
impl<'a> Iterator for IterMut<'a>{
    type Item = &'a mut i32;
    fn next(&mut self) -> Option<Self::Item> {
        Option::Some(self.vec)
    }
}

我得到的错误如下:

error: lifetime may not live long enough
  --> src\main.rs:19:9
   |
16 | impl<'a> Iterator for IterMut<'a>{
   |      -- lifetime `'a` defined here
17 |     type Item = &'a mut i32;
18 |     fn next(&mut self) -> Option<Self::Item> {
   |             - let's call the lifetime of this reference `'1`
19 |         Option::Some(self.vec)
   |         ^^^^^^^^^^^^^^^^^^^^^^ associated function was supposed to return data with lifetime `'a` but it is returning data with lifetime `'1`

有人能告诉我为什么它不工作,为什么它在第一个例子中工作?(即使生存期完全相同)

lf3rwulv

lf3rwulv1#

问题是共享引用是Copy,而可变引用不是。

struct IterMut<'a>{
    vec: Option<&'a mut i32>
}
impl<'a> Iterator for IterMut<'a>{
    type Item = &'a mut i32;
    fn next(&mut self) -> Option<Self::Item> {
        self.vec.take()
    }
}

要点是你不能保留你返回的引用。

相关问题