生命周期关闭捕获生锈
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)
}
}
如何缩短闭包的生命周期?
我试图创建一个方法,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)
}
}