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