rust
1fn get_value_good(v: bool) -> Result<usize,&'static str> { 2 if v { 3 Ok(100) 4 } else { 5 Err("error message") 6 } 7}
このRusultの<usize,&'staticv str>
にある&'staticがなんのためにあるのかわかりません。
これはなんでしょうか?
<usize>
じゃだめなのですか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答1件
0
ベストアンサー
標準ライブラリーのResult<T, E>
型はT
とE
という2つのジェネリックな型引数を持ちます。Result<usize, &'static str>
なら、T
の実引数がusize
型、E
の実引数が&'static str
型になります。
&'static str
型の&'static
が何なのかについてですが、まず&
の部分について説明します。&
は参照またはスライスで、&str
ならstr
型の値を指す(不変の)スライスを意味します。str
は文字列型の一種で、より正確にいうとUTF-8形式のバイト列を表します。str
にはスライスを通さないとアクセスできないので、ほとんどの場合、その型を&str
(UTF-8バイト列への不変スライス)または&mut str
(UTF-8バイト列への可変スライス)のように表します。参照とスライスについては、以下の日本語ドキュメントで詳しく解説されています。
次に'static
について説明します。このように'
で始まるものはライフタイム注釈です。これは参照やスライスに求めるライフタイム(生存期間)を指定するためのものです。
ライフタイム注釈は、関数やメソッドの引数型や戻り値型に&
が現れたときに必要になりますが、特定の条件を満たしたときは省略できます。
ご質問のコードはライフタイムが省略できる条件を満たしていません。試しにResult<usize, &'static str>
をResult<usize, &str>
に変更してコンパイルしようとすると、以下のエラーになります。(Rust 1.51.0)
console
1error[E0106]: missing lifetime specifier # ライフタイム指定子がありません 2 --> src/main.rs:5:45 3 | 45 | fn get_value_good(v: bool) -> Result<usize, &str> { 5 | ^ expected named lifetime parameter 6 | 7 = help: this function's return type contains a borrowed value with an elided lifetime, but the lifetime cannot be derived from the arguments 8help: consider using the `'static` lifetime 9 | 105 | fn get_value_good(v: bool) -> Result<usize, &'static str> { 11 | ^^^^^^^^ 12 13error: aborting due to previous error 14 15For more information about this error, try `rustc --explain E0106`.
'static
ライフタイムは特別なライフタイムで、&'static
と書くと、プログラムの実行時に(動的に作られるのではなく)静的に存在するデータを指すことを示します。&str
なら文字列リテラル(例:"error message"
)が'static
ライフタイムを持ちます。
引数の中に&
がついた型がないときに、戻り値型を&
にしたいときは、'static
な&
しか返せません。なぜそうなのかを一言で説明するのは難しいのですが、日本語ドキュメントの「所有権とは?」のあたりをしっかり読むと、だんだん分かってくると思います。
ご質問のコードの引数型はbool
で、これには&
がついていません。そのため、戻り値型を&str
にしたいときは&'static str
にする必要があります。"error message"
のような文字列リテラルは静的に存在するため'static
なライフタイムを持ち、戻り値型と型が合うのでコンパイルできます。
投稿2021/04/02 10:01
編集2021/04/03 12:10総合スコア2055
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。