如何设置盒装闭合捕获`self`的生命周期?

时间:2016-01-05 06:42:27

标签: iterator rust lifetime

我想返回一个迭代器(特别是Filter)。我使用previous answer建议返回一个盒装迭代器。问题是我的过滤器捕获self并得到:

  

错误:闭包可能比当前函数更长,但它借用self,它由当前函数拥有

但我认为我明确表示self有生命'aBox我回来了:

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

1 个答案:

答案 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}}