Scala では、制御フロー指向の方法で考えるという Java/C の習慣を次第に失い、先に進んで興味のあるオブジェクトを最初に取得し、次に通常は amatch
または amap()
またはforeach()
forのようなものを適用することに慣れました。コレクション。コードを構成するためのより自然で的確な方法のように感じられるので、とても気に入っています。
少しずつ、条件についても同じようにプログラムできたらいいのにと思いました。つまり、最初にブール値を取得しmatch
てから、さまざまなことを行います。ただし、本格的なmatch
は、このタスクには少しやり過ぎのようです。
比較:
obj.isSomethingValid match {
case true => doX
case false => doY
}
対Javaに近いスタイルで書くもの:
if (obj.isSomethingValid)
doX
else
doY
ifTrue:
次に、SmalltalkとifFalse:
メッセージ (およびその変形)を思い出しました。Scalaでこのようなものを書くことは可能でしょうか?
obj.isSomethingValid ifTrue doX else doY
バリアントあり:
val v = obj.isSomethingValid ifTrue someVal else someOtherVal
// with side effects
obj.isSomethingValid ifFalse {
numInvalid += 1
println("not valid")
}
さらに、このスタイルを のような単純な 2 状態の型で使用できるようにすることはできますOption
か? より慣用的な使用方法Option
は、それをコレクションとして扱い、その上で , を呼び出すことfilter()
ですが、多くの場合、最後に、定義されている場合は実行し、定義されていない場合は実行したいことがわかります。何かのようなもの:map()
exists()
doX
doY
val ok = resultOpt ifSome { result =>
println("Obtained: " + result)
updateUIWith(result) // returns Boolean
} else {
numInvalid += 1
println("missing end result")
false
}
私には、これは (まだ?) 本格的な よりも見栄えがしますmatch
。
私が思いついた基本実装を提供しています。このスタイル/テクニックおよび/またはより良い実装に関する一般的なコメントは大歓迎です!