Option
mónada es una gran manera expresiva de tratar con cosas de algo o nada en Scala. Pero, ¿qué ocurre si uno necesita registrar un mensaje cuando ocurre "nada"? De acuerdo con la documentación API Scala,Usando O bien para procesar fallas en el código de Scala
El tipo O se utiliza a menudo como una alternativa a scala.Option donde Left representa fallo (por convención) y derecho es similar a algunos.
Sin embargo, no tuve la suerte de encontrar las mejores prácticas con cualquiera de los ejemplos del mundo real o bien que implican bien para el procesamiento de fallas. Por último se me ha ocurrido con el siguiente código para mi propio proyecto:
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)
}
(Tenga en cuenta que este es un fragmento de un proyecto real, por lo que no se compilará en su propia)
que había agradecerle saber cómo está usando Either
en su código y/o mejores ideas para refactorizar el código anterior.
puedo encontrar ninguna mención de es lo que sea en el libro de Odersky, tampoco. – skaffman
Sí, tengo "Programación en Scala" y no pude encontrar ninguna mención de Cualquiera allí. La mejor analogía que conozco es la de Box en Liftweb, que también se usa para llevar fallas: es como Opción, pero con una funcionalidad extra. –
Cualquier alternativa mejor a 'Opción [O bien [Foo, Bar]]'? – Jus12