遗憾的是,ScalaOption
缺少一种方法来做到这一点。我加一个:
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
}
因此,一旦您期望它,就会更容易理解。