我试图在一个复杂的结构体上实现一个迭代器,为此我决定使用一个支持结构,它指向原始的结构体。我写了引用迭代器的代码,它可以工作。但是如果我写同样的代码给一个可变引用,它就不工作了,奇怪的是这个错误似乎和生存期有关。而不是所有权
下面是迭代引用的代码,它可以工作:
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`
有人能告诉我为什么它不工作,为什么它在第一个例子中工作?(即使生存期完全相同)
1条答案
按热度按时间lf3rwulv1#
问题是共享引用是
Copy
,而可变引用不是。要点是你不能保留你返回的引用。