结构与枚举的生命周期差异

时间:2015-06-16 12:59:15

标签: rust lifetime

为什么这样做

#[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()。所以我不知道如何才能让它发挥作用。

这是Lifetime parameters for an enum within a struct

的后续行动

1 个答案:

答案 0 :(得分:2)

  

对我而言,似乎让c = Bar :: Fub(&amp; 17),17持续与前一行相同的生命周期,其中“Foo”在堆栈上创建

字符串文字的生命周期始终为'static,因此总是活得足够长。

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

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

已在Scope of addresses: Does not live long enough

中解决
  

在这种情况下,完全清楚h持续时间长于Bar :: Fub()。

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

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

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