[解決済み] このクエスチョンマークの演算子は何についてですか?
2022-04-21 07:34:33
質問
今読んでいる本
のドキュメントを参照してください。
File
:
//..
let mut file = File::create("foo.txt")?;
//..
とは何ですか?
?
この行の 以前、Rust Bookで見た記憶がないのですが。
どのように解決するのですか?
お気づきかもしれませんが、Rustには例外がありません。パニックはありますが、エラー処理に使うことは推奨されません(回復不能なエラーに使われるものです)。
Rust では、エラー処理には
Result
. 典型的な例としては、次のようなものがあります。
fn halves_if_even(i: i32) -> Result<i32, Error> {
if i % 2 == 0 {
Ok(i / 2)
} else {
Err(/* something */)
}
}
fn do_the_thing(i: i32) -> Result<i32, Error> {
let i = match halves_if_even(i) {
Ok(i) => i,
Err(e) => return Err(e),
};
// use `i`
}
これは素晴らしいことです。
- コードを書くときに、誤ってエラーに対処するのを忘れてしまうことがない。
- コードを読むと、ここにエラーの可能性があることがすぐにわかります。
しかし、非常に冗長であるという点では、理想的とは言えません。そこで、クエスチョンマーク演算子
?
の出番です。
上記は次のように書き換えることができる。
fn do_the_thing(i: i32) -> Result<i32, Error> {
let i = halves_if_even(i)?;
// use `i`
}
の方がはるかに簡潔です。
何
?
がここで行うのは
match
の文は、上記の文に追加を加えたものです。要するに
-
を解凍します。
Result
OKなら -
それは
を返します。
を呼び出すと、エラーが発生します。
Into::into
を使用して、エラー値を別の型に変換することができます。
例外処理とは異なり、どの関数コールがエラーになるのか、ならないのかが一目瞭然です。
?
.
マジックの一例として、これは以下のものにも有効です。
Option
:
// Assume
// fn halves_if_even(i: i32) -> Option<i32>
fn do_the_thing(i: i32) -> Option<i32> {
let i = halves_if_even(i)?;
// use `i`
}
は
?
演算子を使用します。
は、Rust バージョン 1.13.0 で安定化しました。
は、(不安定な)
Try
トライブがあります。
こちらもご覧ください。
関連
-
[解決済み] 借用コンテンツから移動できない/共有リファレンスの後ろから移動できない
-
[解決済み] Rust の `String` と `str` の違いは何ですか?
-
[解決済み] なぜRustコンパイラは、2つのミュータブル参照がエイリアスできないと仮定してコードを最適化しないのですか?
-
[解決済み】文字列リテラルに対して文字列をマッチングさせる方法は?
-
[解決済み】ライブラリとバイナリの両方を持つRustパッケージ?
-
[解決済み】Rustの実行ファイルはなぜこんなに巨大なのですか?
-
[解決済み】Rust 1.xでファイルを読み書きするデファクトの方法は?
-
[解決済み】Rustの正確な自動再参照のルールは?
-
[解決済み] Iterator(またはその他の trait)を返す正しい方法は何ですか?
-
[解決済み】iterとinto_iterの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Rustで絶対値を求めるには?
-
[解決済み] Rustにはキューとスタックコレクションがありますか?
-
[解決済み] 構造体のフィールドをメソッドから変異させるには?
-
[解決済み] 文字列を追加して印刷するにはどうすればよいですか?
-
[解決済み] Rustのユニットテストでprintln! が動作しないのはなぜ?
-
[解決済み】ある値とその値への参照を同じ構造体に格納できないのはなぜですか?
-
[解決済み】Rustで文字列を分割する方法は?
-
[解決済み】RustプログラムがCargoパッケージからメタデータにアクセスする方法は?
-
[解決済み] 同じプロジェクトの別のファイルからモジュールをインクルードする方法は?
-
[解決済み] Cargoで複数のバイナリをビルドするにはどうしたらいいですか?