如何将生存期参数添加到闭包而不返回引用

时间:2019-04-28 17:31:37

标签: rust closures lifetime

假设您有一个函数返回一个对引用起作用的闭包。 当然,引用后面的对象必须至少在调用闭包之前存在。

这是一个非常简单的示例,它演示了该问题。

'static

编译器声明返回的闭包具有生存期 static

  

无法推断适当的寿命
  ...但是借来的... rustc
  main.rs(60,56):此返回类型的寿命为struct Dummy<'a>{ reference: &'a MyStruct, closure: Fn() -> MyStruct } ...
  main.rs(61,5):...但是这是借来的...

我如何告诉编译器,只要引用有效,我就只使用函数(闭包)的结果?

谢谢!

[编辑]

您是否需要一个包含引用和闭包的伪结构?

<h:commandButton ... action="#{loginManagedBean.login}" />

假定克隆的成本很高,并且可能永远不会调用闭包。 ->懒惰评估是必须的。

1 个答案:

答案 0 :(得分:1)

编译器会告诉您该怎么做:

error: cannot infer an appropriate lifetime
 --> src/lib.rs:2:9
  |
1 | fn get_cloned<'a>(obj: &'a MyStruct) -> impl Fn() -> MyStruct {
  |                                         --------------------- this return type evaluates to the `'static` lifetime...
2 |         || {obj.clone()}
  |         ^^^^^^^^^^^^^^^^ ...but this borrow...
  |
note: ...can't outlive the lifetime 'a as defined on the function body at 1:15
 --> src/lib.rs:1:15
  |
1 | fn get_cloned<'a>(obj: &'a MyStruct) -> impl Fn() -> MyStruct {
  |               ^^
help: you can add a constraint to the return type to make it last less than `'static` and match the lifetime 'a as defined on the function body at 1:15
  |
1 | fn get_cloned<'a>(obj: &'a MyStruct) -> impl Fn() -> MyStruct + 'a {
  |                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^

您需要在返回类型上添加+ 'a。然后,编译器会告诉您缺少move,但是在解决之后,your code works

fn get_cloned<'a>(obj: &'a MyStruct) -> impl Fn() -> MyStruct + 'a {
    || {obj.clone()}
}