rustc --explain E0106 日本語訳
2022/2/24 8:25:00
このエラーは、ある型に生存期間がないことを示します。関数シグネチャ内のエラーの場合、生存期間消去のルール(下記参照)を守らなかったことが問題である可能性があります。
エラーとなるコード例
struct Foo1 { x: &bool }.
// ^ 生存期間パラメータが期待される
struct Foo2<'a> { x: &'a bool }. // 正しい
struct Bar1 { x: Foo2}
// ^^^^ 生存期間パラメータが期待される
struct Bar2<'a> { x: Foo2<'a> } // 正しい
enum Baz1 { A(u8), B(&bool), }.
// ^ 生存期間パラメータが期待される
enum Baz2<'a> { A(u8), B(&'a bool), }. // 正しい
type MyStr1 = &str;
// ^ 生存期間パラメータが期待される
タイプ MyStr2<'a> = &'a str; // 正解
生存期間消去は、関数シグネチャの生存期間に関する特別で限定的な推論で、特定のケースで生存期間を省くことができる。
生存期間消去の背景については、[the book][book-le] を参照してください。
生存期間消去の規則では、出力生存期間が省略された関数署名は、以下のいずれかを持っていなければならないとされています。
- ちょうど1つの入力生存期間
- または、複数の入力生存期間があるが、その関数が
&self
または&mut self
レシーバを持つメソッドであること。
最初のケースでは、出力生存期間は一意の入力生存期間と同じであると推論される。2番目のケースでは、生存期間は &self
または &mut self
の生存期間と同じであると推論されます。
以下は消去エラーの例です。
// エラー, 入力生存期間がない
fn foo() -> &str { }.
// エラー, `x` と `y` の生存期間が異なることが推測される
fn bar(x: &str, y: &str) -> &str { }.
// error, `y` の生存期間は `x` の生存期間とは異なることが推測される。
fn baz<'a>(x: &'a str, y: &str) -> &str { }.
[book-le]: https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html#lifetime-elision