gpt4 book ai didi

rust - 生命周期关闭捕获使用rust

转载 作者:行者123 更新时间:2023-11-29 08:19:47 25 4
gpt4 key购买 nike

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

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

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

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 长寿。我不知道如何在不移动自己的情况下完成这项工作。

最佳答案

如果你返回一个闭包,你必须确保闭包有它需要的一切——即使是返回之后(即在(临时)函数参数从堆栈中弹出之后)。

因此,我认为您想将返回的内容移动到闭包中:

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

关于rust - 生命周期关闭捕获使用rust ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58150483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com