質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

1回答

1649閲覧

Rust - Resultの返すものの型にある&'staticがなんなのかわからない。

tasuren

総合スコア76

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

0クリップ

投稿2021/04/02 08:17

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

標準ライブラリーのResult<T, E>型はTEという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
tatsuya6502

総合スコア2035

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問