悲しいことに、 ScalaOption
はこれを正確に行う方法を欠いています。私は1つ追加します:
class OptionWrapper[A](o: Option[A]) {
def fold[Z](default: => Z)(action: A => Z) = o.map(action).getOrElse(default)
}
implicit def option_has_utility[A](o: Option[A]) = new OptionWrapper(o)
これは(私の見解では)少し良い使用法を持っています
op.fold{ println("Empty!") }{ x => doStuffWith(x) }
パターンマッチングの代わりにmap
/を使用できることがどのように定義されているかがわかります。getOrElse
または、Either
すでにfold
メソッドがあります。だからあなたはできる
op.toRight(()).fold{ _ => println("Empty!") }{ x => doStuffWith(x) }
()
しかし、これは、左の値(ここでは、つまりUnit)を指定してから、で何をしたいのかを述べるのではなく、その上で関数を定義する必要があることを考えると、少し不器用ですNone
。
パターンマッチも悪くはありません。特に、コードのブロックが長い場合はそうです。短いものの場合、試合のオーバーヘッドがポイントの邪魔になり始めます。例えば:
op.fold{ printError }{ saveUserInput }
構文上のオーバーヘッドがはるかに少ない
op match {
case Some(x) => saveUserInput(x)
case None => printError
}
したがって、一度期待すると、理解しやすくなります。