2010-10-06 13 views

risposta

2

Io non credo che ci sia uno. Si può vedere this postale per un'implementazione del gestore null coalescenza.

10

È possibile scrivere il proprio con semantica identica - ecco uno che insiste sullo stesso tipo in tutto a causa di valutazione da sinistra a destra, ma si potrebbe cambiarlo a?: Per ottenere una valutazione da destra a sinistra che sarebbe amplia tipi come necessario:

class CoalesceNull[A <: AnyRef](a: A) { def ??(b: A) = if (a==null) b else a } 
implicit def coalesce_anything[A <: AnyRef](a: A) = new CoalesceNull(a) 

scala> (null:String) ?? (null:String) ?? "(default value)" 
res0: String = (default value) 

Ma la ragione per cui questo operatore non esiste può essere che Option è il modo preferito di trattare tali scenari nonché molti casi analoghi di gestione dei valori inesistenti:

scala> List((null:String),(null:String),"(default value)").flatMap(Option(_)).headOption 
res72: Option[java.lang.String] = Some((default value)) 

(Se tu fossi Assicurarsi che almeno uno era non nullo, si potrebbe utilizzare head; notare che questo funziona perché Option(null) converte in None e flatMap raduna insieme solo le voci Some(_).)

+2

credo che dovrebbe essere 'def ?? (b: => A)' per rendere la semantica identica. Penso che il lato destro dell'operatore elvis non debba essere valutato a meno che 'a' sia' null'. Potrebbe essere sbagliato però. – sinharaj

+0

@sinharaj - Probabilmente hai ragione. Non sono così familiare con come C# lo fa. –

3

Prova getOrElse. Il mio amico ha suggerito.

+0

Non un operatore corretto, ma potrebbe essere utile per semplici espressioni: 'Opzione (null: String) .getOrElse ("valore di default")' 'o Opzione (Opzione (null: String) .getOrElse (null: String)). GetOrElse ("valore predefinito") ' – karmakaze

2

V. legata risposta, ma, più precisamente, evita i null. Usa l'opzione.

1

This blog post illustra come implementare "l'operatore Elvis ?:" di Groovy in Scala. Questo fa la stessa cosa dell'operatore ?? di C#.