生存期間省略ルール
Lifetime elision rule
https://doc.rust-lang.org/reference/lifetime-elision.html
以下のいずれかに当てはまる場合、関数の ライフタイム注釈 を省略することが可能
1. 1 つの引数が参照値を受けとり、1 つ以上の参照値を返すケース
戻り値は引数と同じライフタイム注釈を持つと仮定される
e.g. pub fn f(x: &Item) -> (&Item, &Item)
上記は pub fn <'a>f(x: &'a Item) -> (&'a Item, &'a Item) と等しい
2. 1 つ以上の引数が参照値を受け取り、参照値を返さないケース
すべての引数の値が異なるライフタイム注釈を持つと仮定される
e.g. fn f(x: &Item, y: &Item, z: &Item) -> i32
上記は fn f<'a, 'b, 'c>(x: &'a Item, y: &'b Item, z: &'c Item) -> i32 と等しい
3. &self を含む 1 つ以上の引数が参照値を受け取り、1 つ以上の参照値を返すケース
&self と同じライフタイム注釈を持つと仮定される
e.g.
fn f(&self, y: &Item, z: &Item) -> &Thing
上記は fn f<'a, 'b, 'c>(&'a self, y: &'b Item, z: &'c Item) -> &'a Thing と等しい
省略された生存期間が求めるものと違うのであれば、明示的にライフタイム注釈を記述することで指定することも可能
ただし、実際には最初から記述することはほとんどなく、呼び出し側での参照の利用方法と合致しないエラーメッセージが出て書き直すことが大半
#Rust