我有以下Rust程序,它将一个闭包传递给一个生命周期'a
中的泛型函数和一个类型F
的闭包,它通过引用一些本地数据来调用闭包:
fn other_function<'a, F>(f: F)
where F: Fn(&'a u32)
{
let the_value = 0;
f(&the_value);
}
fn main() {
other_function(|_| { /* do nothing */ });
}
无法编译,并显示以下消息:
<anon>:5:8: 5:17 error: `the_value` does not live long enough
<anon>:5 f(&the_value);
^~~~~~~~~
<anon>:3:1: 6:2 note: reference must be valid for the lifetime 'a as defined on the block at 3:0...
<anon>:3 {
<anon>:4 let the_value = 0;
<anon>:5 f(&the_value);
<anon>:6 }
<anon>:4:23: 6:2 note: ...but borrowed value is only valid for the block suffix following statement 0 at 4:22
<anon>:4 let the_value = 0;
<anon>:5 f(&the_value);
<anon>:6 }
error: aborting due to previous error
playpen: application terminated with error code 101
我的最小示例现在可能有点太最小,因为对于此示例,有效的解决方案是删除'a,
和'a
。但是,我在一个更复杂的程序中也有类似的情况,其中需要明确的生命周期。
有没有办法手动指定生命周期,以便上面的程序被编译器接受?
答案 0 :(得分:6)
问题是other_function
的来电者会选择填充'a
的生命周期,但您需要other_function
来执行此操作。您可以使用一些称为更高排名的特征界限的语法:
fn other_function<F>(f: F)
where F: for <'a> Fn(&'a u32)
{
let the_value = 0;
f(&the_value);
}
fn main() {
other_function(|_| { /* do nothing */ });
}
正如您所指出的,在这种情况下,完全省略'a
更有意义。你的案件可能需要更复杂的东西,但是你的例子没有别的意义。调用者不可能指定任何与您调用的方法内的堆栈分配变量兼容的生命周期。