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

标签 rust iterator lifetime ownership

我试图在一个复杂的结构上实现一个迭代器,为此我决定使用一个支持结构,它指向原始结构。 (为此我必须使用生命周期)。我为引用迭代器编写了代码并且它有效。但是如果我为可变引用编写相同的代码,它就不起作用,奇怪的是该错误似乎与生命周期有关,而不是与所有权有关

这是迭代引用的代码,它可以工作:

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`

有人可以告诉我为什么它不起作用,以及为什么它在第一个示例中起作用? (即使生命周期完全相同)

最佳答案

问题是共享引用是复制,而可变引用则不是。 对于您的简单示例,这可行。

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()
    }
}

要点是您无法保留要返回的引用资料。

关于rust - 在具有可变生命周期的结构上实现迭代器时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74509217/

相关文章:

rust - <'_> 未实现特征 `Serialize`

c++ - RandomAccessIterator 是否暗示数据在内存中是连续的?

java - android xml解析中的hashmap

rust - 函数参数中的类型不匹配

rust - 如何使用消耗该成员本身的成员方法替换结构成员?

使用rust :终身问题,需要帮助

rust - rust 主fn读取目录结果错误无法编译

rust - 二元运算 `==` 不能应用于类型 X

rust - ws::Sender 没有实现 std::fmt::Debug

c++ - 是否保证每个迭代器仅调用一次remove_if谓词?