在显式生命周期中,值的存活时间不够长,但在省略时则活得足够长

时间:2015-10-12 20:54:06

标签: rust lifetime

我有以下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。但是,我在一个更复杂的程序中也有类似的情况,其中需要明确的生命周期。

有没有办法手动指定生命周期,以便上面的程序被编译器接受?

1 个答案:

答案 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更有意义。你的案件可能需要更复杂的东西,但是你的例子没有别的意义。调用者不可能指定任何与您调用的方法内的堆栈分配变量兼容的生命周期。