生命周期关闭捕获生锈

lifetime with closure captures in rust

如何缩短闭包的生命周期?

我试图创建一个方法,return是一个与自身相关的迭代器。我不想制作新的结构或其他东西,所以我只是制作了 return 过滤器和映射,并遇到了一些借用检查器错误。

下面的代码是我第一次尝试。

fn f<'b>(&'b self) -> impl Iterator<Item = u8> {
    (0..self.some_number())
        .filter(|&i| self.some_bool_function(i))
        .map(|i| i as u8)
}

以下代码重复了我的问题。

struct A(bool);

impl A {
    fn f<'a>(&'a self) -> impl Iterator<Item = u8> + 'a {
        (0..1).filter(|&i| self.0)
    }
}

甚至更短,

fn g<'a>(t:&'a ()) -> impl 'a + FnMut() {
    || *t
}

这不会编译,因为闭包可能比 self 长寿。我不知道如何在不移动 self 的情况下完成这项工作。

如果你 return 一个闭包,你必须确保闭包有它需要的一切——甚至 after returning (即在(临时) 函数参数从堆栈中弹出)。

因此,我想你想move把你return的东西放到闭包中:

impl A {
    fn f<'a>(&'a self) -> impl Iterator<Item = u8> + 'a {
        (0..1).filter(move |&i| self.0)
    }
}

回复

fn g<'a>(t:&'a ()) -> impl 'a + FnMut() {
    move || *t
}

响应(扩展你的第一个例子):

struct A(bool);

impl A {
    fn some_number(&self) -> usize {
        6
    }
    fn some_bool_function(&self, i: usize) -> bool {
        i%2==0
    }

    fn f<'b>(&'b self) -> impl Iterator<Item = u8> + 'b {
        (0..self.some_number())
            .filter(move |&i| self.some_bool_function(i))
            .map(|i| i as u8)
    }
}