结构与枚举生命周期差异

Struct vs enum lifetime differences

为什么这样做

#[derive(Debug)]
pub struct Foo<'a,'b> {
    s : &'a str,
    n : &'b i32
}
#[test]
fn test_struct() {
    let f = Foo { s : &"bar" , n : &17 };
    println!("{:?}",f);
}

但这不是

#[derive(Debug)]
pub enum Bar<'a,'b> {
    Baz ( &'a str),
    Fub ( &'b i32)
}
#[test]
fn test_struct() {
    let b = Bar::Baz(&"Foo");
    let c = Bar::Fub(&17);
    println!("{:?} {:?}",b,c);
}

错误是(较大文件的一部分,因此请忽略行号)

src\lib.rs:176:27: 176:29 error: borrowed value does not live long enough
src\lib.rs:176         let c = Bar::Fub(&17);
                       ^~~~~~~~~~~~~~~~~~~~~~

对我来说,似乎 let c = Bar::Fub(&17),17 的生命周期与上一行在堆栈上创建 "Foo" 的生命周期相同。如果我稍微修改它并做

let h = &17;
let c = Bar::Fub(&h);

在这种情况下,很明显 h 比 Bar::Fub() 持续时间更长。所以我不确定如何让它工作。

这是

的跟进

To me it seems like let c = Bar::Fub(&17), the 17 lasts the same life time as the previous line where "Foo" is created on the stack

字符串文字始终具有 'static 生命周期,因此将永远存在足够长的时间。

我认为问题在于您遇到的事实是枚举表达式实际上有点像函数调用。有点意思是在计算 Enum 的生命周期时忽略了参数的生命周期。枚举的生命周期显然稍大一些,就像你写的那样:

let c: Bar;
let x = &17;
c = Bar::Fub(x);

已在 Scope of addresses: Does not live long enough

中解决

In which case it's completely clear that h lasts longer than Bar::Fub().

是的,生命周期在这里很清楚,它works in the Playpen:

let x = &17;
let c = Bar::Fub(x);

所以我不确定你在问什么。