Mi attenersi a None
quando possibile, che è quasi sempre, è più breve e ampiamente utilizzato. Option.empty
consente di specificare il tipo di valore sottostante, quindi utilizzarlo quando è necessario aiutare a digitare l'inferenza. Se il tipo è già noto per il compilatore None
avrebbe funzionato come previsto, tuttavia definendo nuova variabile
var a = None
causerebbe infering a
come None.type
che è improbabile che ci si aspetta.
È possibile quindi utilizzare uno dei paio di modi per aiutare dedurre ciò che è necessario
@ var a = Option.empty[String]
a: Option[String] = None
@ var a: Option[String] = None
a: Option[String] = None
@ var a = None: Option[String] // this one is rather uncommon
a: Option[String] = None
Un altro posto quando compilatore avrebbe bisogno di aiuto:
List(1, 2, 3).foldLeft(Option.empty[String])((a, e) => a.map(s => s + e.toString))
(codice non ha alcun senso, ma solo per fare un esempio, Se si omette il tipo o lo si sostituisce con None
, il tipo di accumulatore viene dedotto rispettivamente a Option[Nothing]
e None.type
.
E per me personalmente questo è il posto che vorrei andare con Option.empty
, per gli altri casi mi attengo con None
quando possibile.
fonte
2016-03-28 09:10:27
Non riesco a pensare a nessun senso in cui "entrambi risolvono l'opzione [niente]". E come mostrano altre risposte, non possono essere sempre usati in modo intercambiabile. –
Sì, hai ragione, stavo parlando di Scalaz ma il significato non era chiaro. Grazie. Ho aggiornato la risposta. –
Anche lì, si ottiene effettivamente "none [A]: Option [A]'.Questo è lo stesso tipo di 'Option.empty', non di 'Option [Nothing]'; questo è -perché_ può essere usato in modo intercambiabile. Si ottiene solo l'opzione [Nothing] 'se è usata senza l'argomento type in una posizione in cui Scala non può inferirlo, come con' Option.empty'. –