这段代码:
struct Foo<'a> {
value: Option<&'a int>,
parent: Option<&'a Foo<'a>>
}
impl<'a> Foo<'a> {
fn bar<'a, 'b, 'c: 'a + 'b>(&'a self, other:&'b int) -> Foo<'c> {
return Foo { value: Some(other), parent: Some(self) };
}
}
fn main() {
let e = 100i;
{
let f = Foo { value: None, parent: None };
let g:Foo;
{
g = f.bar(&e);
}
// <--- g should be valid here
}
// 'a of f is now expired, so g should not be valid here.
let f2 = Foo { value: None, parent: None };
{
let e2 = 100i;
let g:Foo;
{
g = f2.bar(&e2);
}
// <--- g should be valid here
}
// 'b of e2 is now expired, so g should not be valid here.
}
无法编译错误:
<anon>:8:30: 8:35 error: cannot infer an appropriate lifetime due to conflicting requirements
<anon>:8 return Foo { value: Some(other), parent: Some(self) };
^~~~~
<anon>:7:3: 9:4 note: consider using an explicit lifetime parameter as shown: fn bar<'a, 'b>(&'a self, other: &'b int) -> Foo<'b>
<anon>:7 fn bar<'a, 'b, 'c: 'a + 'b>(&'a self, other:&'b int) -> Foo<'c> {
<anon>:8 return Foo { value: Some(other), parent: Some(self) };
<anon>:9 }
(游戏围栏:http://is.gd/vAvNFi)
这显然是一个人为的例子,但这是我偶尔要做的。
所以...
1)如何结合生命?(即,返回寿命至少为'a或'b,以较短者为准的Foo)
2)是否有某种方法可以编写针对资产寿命编译失败的测试?(例如,尝试以错误的方式编译使用功能的#[test]并因生命周期错误而失败)
边界'c: 'a + 'b
表示'c
至少与'a
和一样长'b
。然而,在这种情况下,该Foo
值是有效的正是最短的'a
和'b
:一旦作为参考值的数据背后去的范围之整个Foo
必须被无效。(这是说,数据的有效期为'c
在有效工会的'a
和'b
。)
用更具体的术语说'b = 'static
,则'c: 'a + 'static
意味着也'c
必须为'static
,因此返回值将为Foo<'static>
。这显然是不对的,因为它将把有限的'a
self
参考“升级”为永久的参考。
此处的正确行为是使用生命周期的交集:Foo
仅当两个函数参数均有效时,才有效。相交操作只是用相同的名称标记引用:
fn bar<'a>(&'a self, other: &'a int) -> Foo<'a>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句