Rust 如何从具有结构引用的方法返回装箱闭包?
我有一个包含值的结构,我想获得一个对该值进行操作的函数:Rust 如何从具有结构引用的方法返回装箱闭包?,rust,closures,lifetime,Rust,Closures,Lifetime,我有一个包含值的结构,我想获得一个对该值进行操作的函数: struct Returner { val: i32, } impl<'a> Returner { fn get(&'a self) -> Box<Fn(i32) -> i32> { Box::new(|x| x + self.val) } } struct返回程序{ 瓦尔:i32, } impl Box i32>{ 框::新(| x | x+self
struct Returner {
val: i32,
}
impl<'a> Returner {
fn get(&'a self) -> Box<Fn(i32) -> i32> {
Box::new(|x| x + self.val)
}
}
struct返回程序{
瓦尔:i32,
}
impl Box i32>{
框::新(| x | x+self.val)
}
}
编译失败:
错误[E0495]:由于需求冲突,无法推断适当的生存期
-->src/main.rs:7:18
|
7 | Box::new(| x | x+self.val)
| ^^^^^^^^^^^^^^^^
|
注意:首先,生命周期不能超过impl上定义的生命周期“a”,时间为5:1。。。
-->src/main.rs:5:1
|
5 | impl通常,您可以通过写入Box
来指定装箱特征对象的生存期
然而,当你这样做的时候,你会看到另一个关于self
活得不够长的错误。原因是(没有move
)闭包将捕获对局部变量self
的引用。解决方法是使用move
。这不会移动Returner
对象,而是移动self
,它是对Returner
对象的引用
总之:
struct Returner {
val: i32,
}
impl<'a> Returner {
fn get(&'a self) -> Box<Fn(i32) -> i32 + 'a> {
Box::new(move |x| x + self.val)
}
}
struct返回程序{
瓦尔:i32,
}
输入框i32+'a>{
框::新建(移动| x | x+self.val)
}
}
如前所述:
添加一个生存期,将self
的生存期与返回值的生存期联系起来
将对self
的引用移动到闭包中
从Rust 1.26开始,如果只返回单个类型,则不再需要返回盒装闭包。相反,您可以使用impl Trait
:
impl Returner {
fn get<'a>(&'a self) -> impl Fn(i32) -> i32 + 'a {
move |x| x + self.val
}
}
impl返回器{
fn get impl fn(i32)->i32+'a{
移动| x | x+self.val
}
}
另见:
是我还是这个@MatthieuM。你说得对,应该是这样。这里正好没有区别,因为'a
在其他任何地方都不会出现,但它确实是量词的错误位置。@Matthieu M。我已经检查了两种方法,结果是相同的。