2009-09-01 15 views
20

Después de ver las respuestas provenientes de preguntas como this one que involucran espectáculos de terror como tratar de atrapar el NPE y dragar el nombre destrozado del rastro de la pila, estoy haciendo esta pregunta para poder responderla.¿Cómo se escribe un operador coalescente seguro a prueba de nulidad en Scala?

Comentarios o mejoras adicionales bienvenidos.

+3

Debería haber respondido a esa pregunta en lugar de crear una nueva. O, tal vez, además de. –

+3

Si usted lo dice. Cuando respondo una pregunta más de 24 horas después de haberla formulado, la respuesta languidece en la oscuridad, independientemente de su mérito relativo (y dado que solo respondo preguntas de scala, tengo una idea del valor de mi respuesta). – extempore

+0

gracias, fue un horror ver una solución que implica excepciones. a menos que desee ralentizar su aplicación en varios órdenes de magnitud. – smartnut007

Respuesta

33

así:

case class ?:[T](x: T) { 
    def apply(): T = x 
    def apply[U >: Null](f: T => U): ?:[U] = 
    if (x == null) ?:[U](null) 
    else ?:[U](f(x)) 
} 

Y en acción:

scala> val x = ?:("hel")(_ + "lo ")(_ * 2)(_ + "world")() 
x: java.lang.String = hello hello world 

scala> val x = ?:("hel")(_ + "lo ")(_ => (null: String))(_ + "world")() 
x: java.lang.String = null 
+0

esto es realmente muy bien – jpswain

+8

¡He esperado siete años para que alguien hiciera esa observación! Gracias. – extempore

Cuestiones relacionadas