假设您有一个函数返回一个对引用起作用的闭包。 当然,引用后面的对象必须至少在调用闭包之前存在。
这是一个非常简单的示例,它演示了该问题。
'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}" />
?
假定克隆的成本很高,并且可能永远不会调用闭包。 ->懒惰评估是必须的。
答案 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()}
}