Этот код:Как вы комбинируете времена жизни в ржавчине?
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 Foo, который имеет время жизни не менее a или b, что когда-либо меньше)
2) Есть ли способ написать тесты на сбой компиляции ресурса? (например, попытаться составить # [тест], который использует функцию в неправильном направлении, и не с пожизненной ошибкой)
(BTW, код в пост не компилируется и не соответствует коду в ссылке манеж.) – huon
@dbaupp мой плохой , Исправлено. – Doug