Scala的Option
是,可悲的是,缺少一个方法做的正是这种。我想补充一个:
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) }
但是这是一个有点笨拙因为你必须提供左值(这里()
,即单位),然后定义一个函数,而不是仅仅说明你要对发生的事情None
。
模式匹配也不错,特别是对于较长的代码块。对于短小的比赛来说,比赛的开销会影响到比赛的重点。例如:
op.fold{ printError }{ saveUserInput }
已经少了很多语法开销比
op match {
case Some(x) => saveUserInput(x)
case None => printError
}
,因此,一旦你希望它是一个更容易理解。
你可能想看看[Tony Morris'scala.Option Cheat Sheet](http://blog.tmorris.net/scalaoption-cheat-sheet/) – 2011-12-16 17:50:37
链接已变成http://blog.tmorris .net/posts/scalaoption-cheat-sheet/index.html – giampaolo 2014-02-13 20:59:06