【问题标题】:Struct vs enum lifetime differences结构与枚举的生命周期差异
【发布时间】:2015-06-16 12:59:14
【问题描述】:

为什么会这样

#[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(&amp;17),17 的生命周期与在堆栈上创建 "Foo" 的前一行的生命周期相同。如果我稍微修改一下并做

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

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

这是对Lifetime parameters for an enum within a struct的跟进

【问题讨论】:

  • "Foo" 实际上并不存在于堆栈中,这与17 不同。 "Foo"&amp;'static str,所以它的寿命确实比 17 长。
  • 我认为这是我正在寻找的实际答案

标签: rust lifetime


【解决方案1】:

在我看来,let c = Bar::Fub(&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);

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

【讨论】:

  • 我错过了字符串的“静态”范围。但是是的,一旦我意识到这一点,其余的就很明显了;虽然有点烦人。我想我必须将 Bar 中的所有内容存储为值而不是引用,以保持一致。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
  • 1970-01-01
相关资源
最近更新 更多