foreach
を使用する理由、map
、flatMap
などは、get
をScalaオプションとして使用するよりも優れていると考えられますか? isEmpty
を使用している場合は、get
に電話することができます。Scalaオプションではforeachがうまくいくのはなぜですか?
答えて
まあ、それは "教えて、尋ねないで"と戻ってきます。これらの2行を考えてみましょう:最初のケースで
if (opt.isDefined) println(opt.get)
// versus
opt foreach println
を、あなたは内部opt
を探して、次に何を参照してくださいに応じて反応しています。後者の場合、あなたは何をしたいのかをopt
に伝えておき、それに対処しましょう。
Option
の内部ロジックを複製するのはあまりにも多く、あまりにも脆弱でエラーが発生する可能性があります(誤って書き込まれた場合、コンパイル時エラーではなくランタイムエラーが発生する可能性があります)。
これに加えて、それは構成可能ではありません。あなたは3つのオプションを持っている場合は、理解のための単一のは、それらの世話をする:、物事が速く厄介始める
for {
op1 <- opt1
op2 <- opt2
op3 <- opt3
} println(op1+op2+op3)
if
で。
ではなくget
を使用して、機能を実行するのOption
に直接map
、foreach
、およびflatMap
のようなものを適用することがより有用だ理由は、それがSome
またはNone
のいずれかで動作し、あなたがする必要がないことですその値が存在することを確認するために特別なチェックを行います。
val x: Option[Int] = foo()
val y = x.map(_+1) // works fine for None
val z = x.get + 1 // doesn't work if x is None
ここy
に対する結果はx
がオプションである場合、y
でも未定かもしれないので、望まれる、Option[Int]
あります。 get
はNone
では機能しませんので、エラーが発生していないことを確認するために余分な作業が必要です。 map
によってあなたのために行われる余分な仕事。
foreach
を使用する良い理由の1つは、ネストされたオプションで何かを解析しています。
val nestedOption = Some(Some(Some(1)))
for {
opt1 <- nestedOption
opt2 <- opt1
opt3 <- opt2
} println(opt3)
コンソールには1
が表示されます。これを拡張して、オプションで別の参照を格納するクラスを必要に応じて格納するクラスに拡張すると、理解のために、None/Someチェックの巨大な「ピラミッド」を避けることができます。
実際の質問には既に優れた回答がありますが、Option
-fooの場合はTony Morris' Option Cheat Sheetを必ずチェックしてください。簡単に言えば
:
を使用すると、オプションが定義されている場合にのみ何か(あなたが各呼び出しの戻り値をキャプチャする必要はありません手順)を行う必要がある場合(すなわち、)
Some
である:それはない場合は、各呼び出しの結果を気にしている場合、あなたはオプションが定義されている場合は、何かを行う必要がある場合)map
を使用し、(を
foreach
を使用し、何か他のもの:if文でisDefined
を使用それが
None
である場合、このオプションはSome
、またはデフォルト値である場合は、値が必要な場合:で私たちの操作を実行しようとするとgetOrElse
を使用はより多くの必須のスタイルです。電話番号はとする必要があります。。言い換えれば、私たちは物事を指示しており、Options
の内部にもっと掘り下げています。 map,flatmap
は、我々が言うところの、より機能的な方法です。何をするべきか、どうやって行うべきか。
- 1. Rails - なぜ1つはうまくいくのですか?
- 2. なぜ、アンドロイドエミュレータがうまくいくのですか?
- 3. 継承がうまくいかないと思うのはなぜですか?
- 4. 私のゲームはLinuxではうまく動くが、Windowsではうまくいかないのはなぜですか? (Java .jar)
- 5. JSON.parse( '{"key": "value"}')はうまくいくが、JSON.parse( '{key: "value"}')はしないのはなぜですか?ノードREPLから
- 6. 私のコードは小さなファイルでうまく動作しますが、大きなファイルではうまくいかないのはなぜですか?
- 7. Djangoのテストコマンドでいくつかのオプションが認識されないのはなぜですか?
- 8. 私のブートストラップCSS divがうまくスタックしないのはなぜですか?
- 9. なぜこのReadWriteLockの例はうまくいかないのですか?
- 10. ゲームはソースからはうまくいくが、py2appではできない。
- 11. Django JWT Auth、なぜ1つのリクエストがうまくいくのですか?
- 12. なぜこの宣言はうまくいかないのですか?
- 13. この行はスクリプトエディタではうまく動作しますが、コマンドラインではうまく動作しないのはなぜですか?
- 14. FFでFlash objが見えないのはなぜですか?IE、Safari、Chromeでうまくいきますか?
- 15. Project LombokはScalaでうまく動作しますか?
- 16. pytzオフセットが正しくないのはなぜですか?
- 17. navigator.cpuClassが正しくないのはなぜですか?
- 18. なぜ私の解析がうまくいかないのですか?
- 19. Scalaでのマッチは、メソッドではなくキーワードとして実装されたのはなぜですか?
- 20. 私のScala関数は、最後の行ではなくUnit型を返すのはなぜですか?
- 21. なぜ "middle = arr [(beg + end)/ 2]"がうまくいかないのですか?
- 22. ラムダではどんなデザインパターンがうまくいくのですか?
- 23. Javaオプションは変更できないのはなぜですか?
- 24. なぜlog4j2がうまくいかなかったのですか?
- 25. なぜRingtoneManager.setActualDefaultRingtoneUriがうまくいかなかったのですか? [アンドロイドAPI-8]
- 26. 私のPHP foreachはなぜ機能しないのですか?
- 27. なぜこのjavascriptクラッシュサファリがFirefoxではなくですか?
- 28. は、なぜ私がこのScalaで
- 29. "このホットコードパスでStringBuilderまたはforeachを使用しないでください"
- 30. `foreach`はいつ文字列で動作しなくなりましたか?
はい、私は 'get'を意味します。私は投稿を修正しています。 – Michael
私は考えました。私はその部分を無視するために私の答えを編集しました。 – dhg