结构与枚举生命周期差异
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);
所以我不确定你在问什么。
为什么这样做
#[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);
所以我不确定你在问什么。