Option
monad è un ottimo modo espressivo per gestire qualcosa o qualcosa in Scala. Ma cosa succede se è necessario registrare un messaggio quando "nulla" si verifica? Secondo la documentazione delle API Scala,Uso di Either per elaborare errori nel codice Scala
Il tipo O è spesso usato come un alternativa al scala.Option dove Sinistra rappresenta il fallimento (per convenzione) e destro è simile ad alcuni.
Tuttavia, non ho avuto fortuna di trovare le migliori pratiche che utilizzano Either o esempi di esempi reali che riguardano Either per l'elaborazione dei guasti. Alla fine mi è venuta in mente il seguente codice per il mio progetto:
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)
}
(Si prega di notare che questo è un frammento di un vero e proprio progetto, in modo che non si compila da solo)
mi piacerebbe essere grati di sapere come stai usando Either
nel tuo codice e/o idee migliori sul refactoring del codice precedente.
riesco a trovare alcuna menzione di qualunque cosa nel libro di Odersky, neanche. – skaffman
Sì, ho "Programmazione in Scala" e non ho trovato alcuna menzione di Either in là. La migliore analogia che conosco è Box in Liftweb che viene utilizzato allo scopo di portare anche i guasti - è come Option, ma con funzionalità extra. –
Qualunque alternativa migliore all'opzione [O [Foo, Bar]] '? – Jus12