Prima di tutto, l'implementazione del "contrario" ha alcuni problemi seri. Inserendo un parametro di tipo Long
nel metodo, si nasconde il tipo Long
dalla libreria standard. Probabilmente hanno il seguente significato invece:
def toOption(value: Long): Option[Long] =
if (value == null) None else Some(value)
Anche questo è una specie di assurdo (dal scala.Long
non è un tipo di riferimento e non può mai essere null
), a meno che non ti riferisci a java.lang.Long
, che è una ricetta per il dolore e la confusione. Infine, anche se si trattasse di un tipo di riferimento (come String
), si sarebbe meglio scrivere il seguente, che è esattamente equivalente:
def toOption(value: String): Option[String] = Option(value)
Questo metodo restituirà None
se e solo se è value
null
.
Per rispondere alla sua domanda, supponiamo di avere il seguente metodo:
def foo(x: Long) = x * 2
Non si dovrebbe generalmente pensare in termini di superamento di un Option[Long]
a foo
, ma piuttosto di "lifting" foo
nella Option
via map
:
scala> val x: Option[Long] = Some(100L)
x: Option[Long] = Some(100)
scala> x map foo
res14: Option[Long] = Some(200)
il punto di Option
è per modellare (a livello di tipo) la possibilità di un valore "nullo" al fine di evitare un intero classe di NullPointerException
-y problemi. L'utilizzo di map
su Option
consente di eseguire calcoli sul valore che può essere nel Option
continuando a modellare la possibilità che sia vuoto.
come un'altra nota di risposta, è anche possibile utilizzare getOrElse
a "bail out" del Option
, ma questo di solito non è l'approccio idiomatico a Scala (tranne nei casi in cui non v'è davvero un valore predefinito ragionevole).
fonte
2013-11-04 10:40:34
+1 per l'utilizzo della corrispondenza del modello per estrarre i valori facoltativi. –