作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为什么会这样
#[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);
所以我不确定你在问什么。
关于rust - 结构与枚举生命周期差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30868300/
我是一名优秀的程序员,十分优秀!