Option
Монада - отличный выразительный способ справиться с чем-то или чем-либо в Скале. Но что, если нужно регистрировать сообщение, когда «ничего» не происходит? Согласно документации API Scala,Использование Либо для обработки сбоев в коде Scala
Тип Либо часто используется в качестве альтернативы scala.Option где левый представляет собой отказ (по соглашению) и Право сродни Некоторые.
Однако мне не повезло найти лучшие практики с использованием Либо или хороших примеров реального мира, связанных с Либо для обработки сбоев. Наконец я придумал следующий код для моего собственного проекта:
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
в своем коде и/или более совершенные идеи по рефакторингу вышеуказанного кода.
Я не могу найти никаких упоминаний о это вообще в книге Одерского. – skaffman
Да, у меня есть «Программирование в Scala», и я не мог найти упоминания о Либо там. Лучшей аналогией, которую я знаю, является Box в Liftweb, который также используется для переноса сбоев - это как опция, но с дополнительной функциональностью. –
Любая лучшая альтернатива 'Option [Либо [Foo, Bar]]'? – Jus12