封闭过程中的锈蚀寿命

时间:2019-09-28 21:34:28

标签: rust closures lifetime

如何减少封闭的寿命?

我试图创建一个方法,该方法返回与self相关的迭代器。我不想制作新的结构或其他东西,所以我只是使其返回过滤器和地图,并遇到了一些借阅检查器错误。

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

Choropleth

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

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

这不会编译,因为闭包可能会超出自我。我不知道如何在不动自己的情况下完成这项工作。

1 个答案:

答案 0 :(得分:0)

如果返回闭包,则必须确保闭包具有所需的一切-甚至在返回 之后(即,从堆栈中弹出(临时)函数参数之后)。

因此,我想您想move返回到闭包中的内容:

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