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。我已经检查了两种方法,结果是相同的。