error: lifetime may not live long enough
『error - ライフタイムの不足』の再借用についての派生パターン。
可変参照フィールドへのアクセスは、『再借用』により行われる。
そしてこの場合、結果の参照のライフタイムは、フィールドアクセス式のベース側のライフタイムにより制限される。そのため、フィールド側のライフタイムがたとえ長くても、ベース側のライフタイムが短いと、結果のライフタイムはベース側の短いものとなる。
以下では、arg.0
は可変参照であるため、そのライフタイムは arg
の 's
になる。ここで、戻り値のライフタイムには 'l
が期待されていて、arg
の型から暗黙的に 'l: 's
と分かる。そのため、ライフタイムが 's
の参照は使えない。
struct Holder<'a>(&'a mut i32);
fn val<'l, 's>(arg: &'s Holder<'l>) -> &'l i32 {
arg.0
}
error: lifetime may not live long enough --> src\lib.rs:5:5 | 3 | fn val<'l, 's>(arg: &'s Holder<'l>) -> &'l i32 { | -- -- lifetime `'s` defined here | | | lifetime `'l` defined here 4 | arg.0 | ^^^^^ function was supposed to return data with lifetime `'l` but it is returning data with lifetime `'s` | = help: consider adding the following bound: `'s: 'l`
引数のライフタイムを長くする。
struct Holder<'a>(&'a mut i32);
fn val<'l>(arg: &'l Holder<'_>) -> &'l i32 {
arg.0
}
戻り値のライフタイムを短くする。
struct Holder<'a>(&'a mut i32);
fn val<'l, 's>(arg: &'s Holder<'l>) -> &'s i32 {
arg.0
}
以下では、self.0
は可変参照であるため、そのライフタイムは self
のそれと同じになる。ここで、戻り値のライフタイムには 'a
が期待されていて、self
のライフタイムは 'a
より短い。そのため、ライフタイムが self
と同じ参照は使えない。
struct Holder<'a>(&'a mut i32);
impl<'a> Holder<'a> {
fn val(&self) -> &'a i32 {
self.0
}
}
error: lifetime may not live long enough --> src\lib.rs:5:9 | 3 | impl<'a> Holder<'a> { | -- lifetime `'a` defined here 4 | fn val(&self) -> &'a i32 { | - let's call the lifetime of this reference `'1` 5 | self.0 | ^^^^^^ method was supposed to return data with lifetime `'a` but it is returning data with lifetime `'1`
引数のライフタイムを長くする。
struct Holder<'a>(&'a mut i32);
impl<'a> Holder<'a> {
fn val(&'a self) -> &'a i32 {
self.0
}
}
戻り値のライフタイムを短くする。
struct Holder<'a>(&'a mut i32);
impl Holder<'_> {
fn val(&self) -> &i32 {
self.0
}
}