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