@@ -75,7 +75,7 @@ Rustでは戻り値を使います。
75
75
* [ 複数のエラー型を扱う] ( #複数のエラー型を扱う )
76
76
* [ ` Option ` と ` Result ` を合成する] ( #option-と-result-を合成する )
77
77
* [ コンビネータの限界] ( #コンビネータの限界 )
78
- * [ 早期のリターン ] ( #早期のリターン )
78
+ * [ 早期リターン ] ( #早期リターン )
79
79
* [ ` try! ` マクロ] ( #try-マクロ )
80
80
* [ 独自のエラー型を定義する] ( #独自のエラー型を定義する )
81
81
* [ 標準ライブラリのトレイトによるエラー処理] ( #standard-library-traits-used-for-error-handling )
@@ -182,7 +182,7 @@ fn main() {
182
182
<!-- conditions, yet, the program does not include an explicit call to `panic` like -->
183
183
<!-- the first example. This is because the -->
184
184
<!-- panic is embedded in the calls to `unwrap`. -->
185
- 先ほどの例で、プログラムが2つのエラー条件のいずれかを満たした時に 、パニックすると言いました。
185
+ 先ほどの例で、プログラムが2つのエラー条件のいずれかを満たしたときに 、パニックすると言いました。
186
186
でもこのプログラムは、最初の例とは違って明示的に ` panic ` を呼び出してはいません。
187
187
実はパニックは ` unwrap ` の呼び出しの中に埋め込まれているのです。
188
188
@@ -191,7 +191,7 @@ fn main() {
191
191
<!-- It would be better if we just showed the code for unwrapping because it is so -->
192
192
<!-- simple, but to do that, we will first need to explore the `Option` and `Result` -->
193
193
<!-- types. Both of these types have a method called `unwrap` defined on them. -->
194
- Rustでなにかを「アンラップする」時 、こう言っているのと同じです。
194
+ Rustでなにかを「アンラップする」とき 、こう言っているのと同じです。
195
195
「計算結果を取り出しなさい。もしエラーになっていたのなら、パニックを起こしてプログラムを終了させなさい。」
196
196
アンラップのコードはとてもシンプルなので、多分、それを見せたほうが早いでしょう。
197
197
でもそのためには、まず ` Option ` と ` Result ` 型について調べる必要があります。
@@ -244,7 +244,7 @@ fn find(haystack: &str, needle: char) -> Option<usize> {
244
244
<!-- with the type `fn<T>(value: T) -> Option<T>`. Correspondingly, `None` is also a -->
245
245
<!-- value constructor, except it has no arguments. You can think of `None` as a -->
246
246
<!-- function with the type `fn<T>() -> Option<T>`. -->
247
- この関数がマッチする文字を見つけた時 、単に ` offset ` を返すだけではないことに注目してください。
247
+ この関数がマッチする文字を見つけたとき 、単に ` offset ` を返すだけではないことに注目してください。
248
248
その代わりに ` Some(offset) ` を返します。
249
249
` Some ` は ` Option ` 型の * 値コンストラクタ* の一つです。
250
250
これは ` fn<T>(value: T) -> Option<T> ` という型の関数だと考えることもできます。
@@ -282,7 +282,7 @@ fn main() {
282
282
<!-- `None` instead of `Some(t)`. -->
283
283
このコードは ` find ` 関数が返した ` Option<usize> ` の * 場合分け* に、 [ パターンマッチ] [ 1 ] を使っています。
284
284
実のところ、場合分けが、` Option<T> ` に格納された値を取り出すための唯一の方法なのです。
285
- これは、` Option<T> ` が ` Some(t) ` ではなく ` None ` だった時 、プログラマであるあなたが、このケースに対処しなければならないことを意味します。
285
+ これは、` Option<T> ` が ` Some(t) ` ではなく ` None ` だったとき 、プログラマであるあなたが、このケースに対処しなければならないことを意味します。
286
286
287
287
<!-- But wait, what about `unwrap`,which we used [`previously`](#code-unwrap-double)? -->
288
288
<!-- There was no case analysis there! Instead, the case analysis was put inside the -->
@@ -421,8 +421,8 @@ fn extension(file_name: &str) -> Option<&str> {
421
421
<!-- the extension of a file is `rs` even if none is present. As you might imagine, -->
422
422
<!-- the case analysis for this is not specific to file extensions - it can work -->
423
423
<!-- with any `Option<T>`: -->
424
- もう一つの共通のパターンは、` Option ` の値が ` None ` だった時のデフォルト値を与えることです 。
425
- 例えばファイルの拡張子がない時は 、それを ` rs ` とみなすようなプログラムを書きたくなるかもしれません。
424
+ もう一つの共通のパターンは、` Option ` の値が ` None ` だったときのデフォルト値を与えることです 。
425
+ 例えばファイルの拡張子がないときは 、それを ` rs ` とみなすようなプログラムを書きたくなるかもしれません。
426
426
ご想像の通り、このような場合分けはファイルの拡張子に特有のものではありません。
427
427
どんな ` Option<T> ` でも使えるでしょう:
428
428
@@ -554,7 +554,7 @@ fn file_path_ext(file_path: &str) -> Option<&str> {
554
554
<!-- remove choices because they will panic if `Option<T>` is `None`. -->
555
555
コンビネータは明示的な場合分けを減らしてくれるので、 ` Option ` のような型をエルゴノミックにします。
556
556
またこれらは * 不在の可能性* を、呼び出し元がそれに合った方法で扱えるようにするので、合成可能だといえます。
557
- ` unwrap ` のようなメソッドは、 ` Option<T> ` が ` None ` の時にパニックを起こすので 、このような選択の機会を与えません。
557
+ ` unwrap ` のようなメソッドは、 ` Option<T> ` が ` None ` のときにパニックを起こすので 、このような選択の機会を与えません。
558
558
559
559
<!-- ## The `Result` type -->
560
560
## ` Result ` 型
@@ -707,7 +707,7 @@ impl str {
707
707
それも悪いやり方ではありませんが、実装の内側では * なぜ* 文字列が整数としてパースできなかったを、ちゃんと区別しています。
708
708
(空の文字列だったのか、有効な数字でなかったのか、大きすぎたり、小さすぎたりしたのか。)
709
709
従って、` Result ` を使ってより多くの情報を提供するほうが、単に「不在」を示すことよりも理にかなっています。
710
- 今後、もし ` Option ` と ` Result ` のどちらを選ぶという事態に遭遇した時は 、このような理由付けのやり方を真似てみてください。
710
+ 今後、もし ` Option ` と ` Result ` のどちらを選ぶという事態に遭遇したときは 、このような理由付けのやり方を真似てみてください。
711
711
もし詳細なエラー情報を提供できるのなら、多分、それをしたほうがいいでしょう。
712
712
(後ほど別の例もお見せます。)
713
713
@@ -855,16 +855,16 @@ fn double_number(number_str: &str) -> Result<i32> {
855
855
<!-- appealing. -->
856
856
* ** 即興で書いたサンプルコード。**
857
857
サンプルコードや簡単なプログラムを書いていて、エラーハンドリングが単に重要でないこともあります。
858
- このような時に ` unwrap ` の便利さは、とても魅力的に映るでしょう。
858
+ このようなときに ` unwrap ` の便利さは、とても魅力的に映るでしょう。
859
859
これに打ち勝つのは難しいことです。
860
860
861
861
<!-- * **When panicking indicates a bug in the program.** When the invariants of -->
862
862
<!-- your code should prevent a certain case from happening (like, say, popping -->
863
863
<!-- from an empty stack), then panicking can be permissible. This is because it -->
864
864
<!-- exposes a bug in your program. This can be explicit, like from an `assert!` -->
865
865
<!-- failing, or it could be because your index into an array was out of bounds. -->
866
- * ** パニックがプログラムのバグの兆候となる時 。**
867
- コードの中の不変条件が、ある特定のケースの発生を未然に防ぐ時 (例えば、空のスタックから取り出そうとしたなど)、パニックを起こしても差し支えありません。
866
+ * ** パニックがプログラムのバグの兆候となるとき 。**
867
+ コードの中の不変条件が、ある特定のケースの発生を未然に防ぐとき (例えば、空のスタックから取り出そうとしたなど)、パニックを起こしても差し支えありません。
868
868
なぜなら、そうすることでプログラムに潜むバグが明るみに出るからです。
869
869
これは ` assert! ` の失敗のような明示的な要因によるものだったり、配列のインデックスが境界から外れたからだったりします。
870
870
@@ -876,7 +876,7 @@ fn double_number(number_str: &str) -> Result<i32> {
876
876
<!-- a bit nicer to deal with, since it will show your message instead of -->
877
877
<!-- “callaed unwrap on a `None` value.” -->
878
878
これは多分、完全なリストではないでしょう。
879
- さらに ` Option ` を使う時は 、ほとんどの場合で [ ` expect ` ] ( ../std/option/enum.Option.html#method.expect ) メソッドを使う方がいいでしょう。
879
+ さらに ` Option ` を使うときは 、ほとんどの場合で [ ` expect ` ] ( ../std/option/enum.Option.html#method.expect ) メソッドを使う方がいいでしょう。
880
880
` expect ` は ` unwrap ` とほぼ同じことをしますが、 ` expect ` では与えられたメッセージを表示するところが異なります。
881
881
この方が結果として起こったパニックを、少し扱いやすいものにします。
882
882
なぜなら「 ` None ` な値に対してアンラップが呼ばれました」というメッセージの代わりに、指定したメッセージが表示されるからです。
@@ -927,7 +927,7 @@ fn double_number(number_str: &str) -> Result<i32> {
927
927
<!-- or can we continue using combinators? -->
928
928
もちろん現実のコードは、いつもこんなにクリーンではありません。
929
929
時には ` Option ` 型と ` Result ` 型が混在していることもあるでしょう。
930
- そんな時は 、明示的な場合分けに頼るしかないのでしょうか?
930
+ そんなときは 、明示的な場合分けに頼るしかないのでしょうか?
931
931
それとも、コンビネータを使い続けることができるのでしょうか?
932
932
933
933
<!-- For now, let's revisit one of the first examples in this chapter: -->
@@ -958,7 +958,7 @@ fn main() {
958
958
<!-- could just use a `String` to describe the error. Let's try: -->
959
959
ここでの問題は ` argv.nth(1) ` が ` Option ` を返すのに、 ` arg.parse() ` は ` Result ` を返すことです。
960
960
これらを直接合成することはできません。
961
- ` Option ` と ` Result ` の両方に出会った時の * 通常の* 解決策は ` Option ` を ` Result ` に変換することです。
961
+ ` Option ` と ` Result ` の両方に出会ったときの * 通常の* 解決策は ` Option ` を ` Result ` に変換することです。
962
962
この例で(` env::args() ` が)コマンドライン引数を返さなかったということは、ユーザーがプログラムを正しく起動しなかったことを意味します。
963
963
エラーの理由を示すために、単純に ` String ` を使うこともできます。
964
964
試してみましょう:
@@ -995,7 +995,7 @@ fn main() {
995
995
この例では、いくつか新しいことがあります。
996
996
ひとつ目は [ ` Option::ok_or ` ] ( ../std/option/enum.Option.html#method.ok_or ) コンビネータを使ったことです。
997
997
これは ` Option ` を ` Result ` へ変換する方法の一つです。
998
- 変換には ` Option ` が ` None ` の時に使われるエラーを指定する必要があります 。
998
+ 変換には ` Option ` が ` None ` のときに使われるエラーを指定する必要があります 。
999
999
他のコンビネータと同様に、その定義はとてもシンプルです:
1000
1000
1001
1001
``` rust
@@ -1084,7 +1084,7 @@ fn main() {
1084
1084
<!-- 2. A problem reading data from the file. -->
1085
1085
<!-- 3. A problem parsing the data as a number. -->
1086
1086
1 . ファイルを開くときの問題
1087
- 2 . ファイルからデータを読み込む時の問題
1087
+ 2 . ファイルからデータを読み込むときの問題
1088
1088
3 . データを数値としてパースするときの問題
1089
1089
1090
1090
<!-- The first two problems are described via the -->
@@ -1117,7 +1117,7 @@ fn main() {
1117
1117
<!-- type from `i32` to something else. -->
1118
1118
まず最初に ` file_double ` 関数をリファクタリングしましょう。
1119
1119
この関数を、このプログラムの他の構成要素と合成可能にするためには、上記の問題のいずれかに遭遇しても、パニック * しない* ようにしなければなりません。
1120
- これは実質的には、なにかの操作に失敗した時に 、この関数が * エラーを返すべき* であることを意味します。
1120
+ これは実質的には、なにかの操作に失敗したときに 、この関数が * エラーを返すべき* であることを意味します。
1121
1121
ここでの問題は、` file_double ` のリターン型が ` i32 ` であるため、エラーの報告には全く役立たないことです。
1122
1122
従ってリターン型を ` i32 ` から別の何かに変えることから始めましょう。
1123
1123
@@ -1133,7 +1133,7 @@ fn main() {
1133
1133
` Option ` なら間違いなく簡単に使えます。
1134
1134
もし3つのエラーのどれかが起こったら、単に ` None ` を返せばいいのですから。
1135
1135
これはたしかに動きますし、 * パニックを起こすよりは良くなっています* 。
1136
- とはいえ、もっと良くすることもだってできます 。
1136
+ とはいえ、もっと良くすることもできます 。
1137
1137
` Option ` の代わりに、発生したエラーについての詳細を渡すべきでしょう。
1138
1138
ここでは * エラーの可能性* を示したいのですから、` Result<i32, E> ` を使うのがよさそうです。
1139
1139
でも ` E ` を何にしたらいいのでしょうか?
@@ -1195,7 +1195,7 @@ fn main() {
1195
1195
<!-- example, the very last call to `map` multiplies the `Ok(...)` value (which is -->
1196
1196
<!-- an `i32`) by `2`. If an error had occurred before that point, this operation -->
1197
1197
<!-- would have been skipped because of how `map` is defined. -->
1198
- ` map ` は ` Result ` の値が ` Ok(...) ` の時に関数を適用するために使います 。
1198
+ ` map ` は ` Result ` の値が ` Ok(...) ` のときに関数を適用するために使います 。
1199
1199
例えば、一番最後の ` map ` の呼び出しは、` Ok(...) ` の値( ` i32 ` 型)に ` 2 ` を掛けます。
1200
1200
もし、これより前にエラーが起きたなら、この操作は ` map ` の定義に従ってスキップされます。
1201
1201
@@ -1205,7 +1205,7 @@ fn main() {
1205
1205
<!-- both `io::Error` and `num::ParseIntError` implement `ToString`, we can call the -->
1206
1206
<!-- `to_string()` method to convert them. -->
1207
1207
` map_err ` は全体をうまく動かすための仕掛けです。
1208
- ` map_err ` は ` map ` に似ていますが、 ` Result ` の値が ` Err(...) ` の時に関数を適用するところが異なります 。
1208
+ ` map_err ` は ` map ` に似ていますが、 ` Result ` の値が ` Err(...) ` のときに関数を適用するところが異なります 。
1209
1209
今回の場合は、全てのエラーを ` String ` という同一の型に変換する予定でした。
1210
1210
` io::Error ` と ` num::ParseIntError ` の両方が ` ToString ` を実装していたので、 ` to_string() ` メソッドを呼ぶことで変換できました。
1211
1211
@@ -1214,18 +1214,18 @@ fn main() {
1214
1214
<!-- returns. -->
1215
1215
説明し終わった後でも、このコードは難解なままです。
1216
1216
コンビネータの使い方をマスターすることは重要ですが、コンビネータには限界もあるのです。
1217
- 次は、早期のリターンと呼ばれる 、別のアプローチを試してみましょう。
1217
+ 次は、早期リターンと呼ばれる 、別のアプローチを試してみましょう。
1218
1218
1219
1219
<!-- ## Early returns -->
1220
- ## 早期のリターン
1220
+ ## 早期リターン
1221
1221
1222
1222
<!-- I'd like to take the code from the previous section and rewrite it using *early -->
1223
1223
<!-- returns*. Early returns let you exit the function early. We can't return early -->
1224
1224
<!-- in `file_double` from inside another closure, so we'll need to revert back to -->
1225
1225
<!-- explicit case analysis. -->
1226
- 前の節で使ったコードを、 * 早期のリターン * を使って書き直してみようと思います。
1227
- 早期のリターンとは 、関数の途中で抜けることを指します。
1228
- ` file_double ` のクロージャの中にいる間は、早期のリターンはできないので 、明示的な場合分けまでいったん戻る必要があります。
1226
+ 前の節で使ったコードを、 * 早期リターン * を使って書き直してみようと思います。
1227
+ 早期リターンとは 、関数の途中で抜けることを指します。
1228
+ ` file_double ` のクロージャの中にいる間は、早期リターンはできないので 、明示的な場合分けまでいったん戻る必要があります。
1229
1229
1230
1230
``` rust
1231
1231
use std :: fs :: File ;
@@ -1403,7 +1403,7 @@ fn main() {
1403
1403
<!-- with *structured data*. We endeavor to not drop information from underlying -->
1404
1404
<!-- errors in case the caller wants to inspect the details. -->
1405
1405
ファイルから整数値を取り出す例で ` String ` をエラー型として用いた代わりに、独自のエラー型を定義し、 * 構造化されたデータ* によってエラー内容を表すことができます。
1406
- 呼び出し元が詳細を検査したい時に備え 、大元のエラーについての情報を取りこぼさないよう、努力してみましょう。
1406
+ 呼び出し元が詳細を検査したいときに備え 、大元のエラーについての情報を取りこぼさないよう、努力してみましょう。
1407
1407
1408
1408
<!-- The ideal way to represent *one of many possibilities* is to define our own -->
1409
1409
<!-- sum type using `enum`. In our case, an error is either an `io::Error` or a -->
@@ -1471,8 +1471,8 @@ fn main() {
1471
1471
<!-- will do in a pinch, particularly if you're writing an application. If you're -->
1472
1472
<!-- writing a library, defining your own error type should be strongly preferred so -->
1473
1473
<!-- that you don't remove choices from the caller unnecessarily. -->
1474
- 目安となる方法は独自のエラー型を定義することですが、 ` String ` エラー型も、いざという時に役立ちます 。
1475
- 特にアプリケーションを書いている時などはそうです 。
1474
+ 目安となる方法は独自のエラー型を定義することですが、 ` String ` エラー型も、いざというときに役立ちます 。
1475
+ 特にアプリケーションを書いているときなどはそうです 。
1476
1476
もしライブラリを書いているのなら、呼び出し元の選択肢を理由もなく奪わないために、独自のエラー型を定義することを強く推奨します。
1477
1477
1478
1478
# Standard library traits used for error handling
0 commit comments