Mi chiedo se posso scrivere qualcosa di simile nel mio codice:Puoi specificare l'argomento type per None o dire al compilatore che si tratta di un'opzione [String]?
None[String]
Mi chiedo se posso scrivere qualcosa di simile nel mio codice:Puoi specificare l'argomento type per None o dire al compilatore che si tratta di un'opzione [String]?
None[String]
Se si desidera specificare il tipo di Option
si potrebbe usare:
Nessuno: opzione [String]
I due punti sono un'annotazione di tipo esplicito.
È possibile con scalaz:
import scalaz._
import Scalaz._
none[String] // res0: Option[String] = None
Option
è un tipo parametrico ed è definito come tale:
... sealed abstract class Option[+A] ...
è essere prolungato di altri 2 classi:
final case class Some[+A](x: A) extends Option[A]
e
case object None extends Option[Nothing]
Mentre Some
può prendere qualsiasi tipo di un argomento, None
è una speciale instance/singleton di un Option
parametrizzati con Nothing
. Inoltre Option
è covariante nell'argomento tipo [+A]
che significa che Option[Nothing]
può essere utilizzato ovunque sia previsto Option
con qualsiasi altro tipo di argomento, poiché Nothing
estende tutti i tipi in Scala. Quindi non è necessario creare altri valori per rappresentare un valore Nothing
, un singleton None
sarà sufficiente per tutti i casi.
In termini di estensibilità Option
è una classe astratta sigillata, quindi non è possibile estenderla. Non è possibile estendere le sottoclassi Some
e None
poiché si tratta di classi di casi.
In genere non è nemmeno necessario provare a scrivere qualcosa come None[String]
perché il tipo più specifico Option
è definito da qualche parte nel contesto. Per esempio, come argomento di funzione:
def f(o: Option[String]) = ...; f(None)
o come affinamento:
val o: Option[String] = None
Inoltre, davvero non importa che tipo di opzione è se si tratta di un valore Nothing
, non è possibile ottenere qualcosa di fuori comunque, è come un null
in Java, ma con comportamento monadico.
E 'stato detto che si può fare qualcosa di simile in scala: none[String]
. Questo è solo uno zucchero sintassi, anche se molto conveniente, per ridurre la verbosità in alcuni casi in cui i tipi devono essere annotati.E 'definita come tale:
final def none[A]: Option[A] = None
Grazie per quello che scrivi – jinglining
@Aleksey Izmailov: Il tuo metodo 'none' esiste già nella libreria standard:' Opzione .empty'. –
non è il mio metodo, ho copiato 'none' da scalaz;) –
Sono sorpreso che nessuno ha menzionato l'esistenza di Option.empty
:
scala> Option.empty[String]
res0: Option[String] = None
nota che in molti casi semplicemente utilizzando None
dove un Option[String]
si prevede funzionerà benissimo. O in altre parole, (come mostrato da Aleksey Izmailov), il seguente è corrrect:
def f(o: Option[String]) = ...; f(None)
Questo perché None
estende Option[Nothing]
, in forza di Option
essere covariante (e Nothing
essendo un sottotipo di ogni altro tipo), None
è sempre compatibile con Option[T]
per qualsiasi T
.
è anche per questo tipo di attribuzione è anche una valida alternativa (per i casi in cui si ha bisogno di essere esplicito del tipo di opzioni, per esempio, se è necessario per guidare l'inferenza dei tipi):
scala> None: Option[String]
res0: Option[String] = None
+1 per 'empty' - non molto diverso dal scalaz –
Sì" Option.empty [Type] "è la procedura migliore. Allo stesso modo per le liste vuote e tale dovrebbe fare 'List.empty [Type]' – samthebest
@samthebest Ci sono ragioni per cui 'Option.empty' è meglio dell'annotazione di tipo esplicita? Solo curioso: – acjay
So che scrivo, il mio punto è se posso specificare il tipo None Like: val a: None [String] = – jinglining