È 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(_)
.)
fonte
2010-10-06 15:29:43
http://stackoverflow.com/questions/1364361/how-to-write-a-proper-null-safe-coalescing-operator-in-scala? – Philippe