gpt4 book ai didi

rust - 结构与枚举生命周期差异

转载 作者:行者123 更新时间:2023-11-29 08:00:40 25 4
gpt4 key购买 nike

为什么会这样

#[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 的跟进

最佳答案

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);

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

关于rust - 结构与枚举生命周期差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30868300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com