我想返回一个迭代器(特别是Filter
)。我使用previous answer建议返回一个盒装迭代器。问题是我的过滤器捕获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 } ) )
}
这是为了简化我的第一次尝试,我创建了一个新的FooIterator
,它以基本相同的方式拥有对self
的引用。
如果我使用大多数相同的语法来简单地捕获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 } )
}
}
答案 0 :(得分:5)
您收到错误,因为您的闭包会收到对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 } ) )
}
本身就是一个引用。但是,由于引用指向局部变量,因此只要函数返回,该引用就会变为无效。
要解决此问题,请在关闭之前添加{{1}}关键字。这指示编译器移动闭包中的闭合变量,而不是将参考传递给闭包的那些变量。
{{1}}