Ben*_*son 3 iterator lifetime rust
我想返回一个迭代器(特别是a Filter
).我使用了之前的答案,建议返回一个盒装迭代器.问题是我的过滤器捕获self
并得到:
错误:闭包可能比当前函数更长,但它借用
self
了当前函数所拥有的函数
但我认为我是明确的,self
有生命'a
,所以Box
我回来了:
fn occupied_iter_x<'a>(&'a self) -> Box<Iterator<Item=i32> + 'a> {
Box::new( (0..32).filter( |&pos| match self.at(pos) { Occupied::Empty => false, _ => true } ) )
}
Run Code Online (Sandbox Code Playgroud)
这是为了简化我的第一次尝试,我创建了FooIterator
一个以self
基本相同的方式拥有引用的new .
如果我使用大多数相同的语法来简单地捕获self
作为成员引用它工作正常:
struct Foo { junk: i32 }
struct FooIterator<'a> { foo: &'a Foo }
impl Foo {
fn foo<'a>(&'a self) -> Box<FooIterator<'a>> {
Box::new( FooIterator { foo: self } )
}
}
Run Code Online (Sandbox Code Playgroud)
你得到一个错误,因为你的闭包收到一个引用self
,它本身就是一个引用.但是,由于引用指向局部变量,因此只要函数返回,该引用就会变为无效.
要解决此问题,请move
在关闭之前添加关键字.这指示编译器在闭包中移动闭合变量,而不是将对这些变量的引用传递给闭包.
fn occupied_iter_x<'a>(&'a self) -> Box<Iterator<Item=i32> + 'a> {
Box::new( (0..32).filter(move |&pos| match self.at(pos) { Occupied::Empty => false, _ => true } ) )
}
Run Code Online (Sandbox Code Playgroud)