Option
monad是處理Scala中的某件事或某件事情的絕妙表達方式。但是如果在「什麼都沒有」的情況下需要記錄消息呢?根據Scala的API文檔,使用或者處理Scala代碼中的故障
的任一類型通常用作 替代scala.Option其中左 表示失敗(約定)和 右類似於一些。
但是,我沒有運氣找到最佳實踐使用Either或良好的現實世界的例子涉及任何處理失敗。最後,我想出了下面的代碼爲我自己的項目:
def logs: Array[String] = {
def props: Option[Map[String, Any]] = configAdmin.map{ ca =>
val config = ca.getConfiguration(PID, null)
config.properties getOrElse immutable.Map.empty
}
def checkType(any: Any): Option[Array[String]] = any match {
case a: Array[String] => Some(a)
case _ => None
}
def lookup: Either[(Symbol, String), Array[String]] =
for {val properties <- props.toRight('warning -> "ConfigurationAdmin service not bound").right
val logsParam <- properties.get("logs").toRight('debug -> "'logs' not defined in the configuration").right
val array <- checkType(logsParam).toRight('warning -> "unknown type of 'logs' confguration parameter").right}
yield array
lookup.fold(failure => { failure match {
case ('warning, msg) => log(LogService.WARNING, msg)
case ('debug, msg) => log(LogService.DEBUG, msg)
case _ =>
}; new Array[String](0) }, success => success)
}
(請注意,這是一個真正的項目的一個片段,所以不會自行編譯)
我會要知道你在代碼中如何使用Either
和/或對重構上述代碼有更好的想法。
我能找到沒有提及它也在Odersky的書中。 – skaffman 2009-07-28 12:35:34
是的,我有「Scala程序設計」,在那裏找不到任何提及。我所知道的最好的比喻是Liftweb中的Box,用於承載失敗的目的 - 它就像選項,但具有額外的功能。 – 2009-07-28 13:16:45
'Option [任何[Foo,Bar]]``更好的選擇? – Jus12 2014-05-05 12:59:06