Suponga que tengo un método session.get(str: String): String
pero no sabe si le devolverá una cadena o un nulo, porque proviene de Java.
¿Hay una forma más fácil de tratar esto en Scala en lugar de session.get("foo") == null
? Tal vez se aplique algo de magia ToOption(session.get("foo"))
y luego pueda tratarlo en Scala como
ToOption(session.get("foo")) match {
case Some(_) =>;
case None =>;
}
java
scala
scala-option
José Leal
fuente
fuente
Respuestas:
El método
Option
del objeto complementarioapply
sirve como función de conversión de referencias que aceptan valores NULL:fuente
El
Option
objeto tiene unapply
método que hace exactamente eso:fuente
Tenga en cuenta que al trabajar con objetos Java, no funcionará como se esperaba:
fuente
¡Este es un tema muy antiguo pero agradable!
Es cierto que convertir cualquier resultado que no sea de excepción de Try to Option dará como resultado un Some ...
... porque Try no se trata de verificar la nulabilidad, sino solo de una forma de manejar funcionalmente las excepciones.
El uso de Intentar detectar una excepción y convertirla en una Opción por conveniencia solo mostrará Ninguno en caso de que ocurra una excepción.
Desea conservar los valores que surgen de Try. Eso puede ser nulo.
Pero también es cierto que la librería estándar a veces es bastante confusa ...
Este comportamiento es un poco inconsistente, pero refleja el uso intencionado de Try y Option.
Usas try para obtener lo que sea que surja de una expresión que pueda generar excepciones, y no te importa la excepción en sí.
El valor que puede aparecer puede muy bien ser nulo. Si toOption dio None, no podría diferenciar entre una excepción y un nulo , ¡y eso no es bonito!
Independiente, usa Option para encapsular la existencia o no de algo. Entonces, en ese caso, Some (null) es None, y eso tiene sentido, porque null en ese caso representa la ausencia de algo. Aquí no hay ambigüedad.
Es importante remarcar que en cualquier caso la transparencia referencial no se rompe ya que .toOption no es lo mismo que Option ()
Si realmente necesita para hacer cumplir AMBOS seguridad de excepción y la seguridad nula, y su código realmente no necesita estudio diferencial entre nulo y una excepción , sólo tiene que combinar ambos paradigmas! Porque bueno, eso es lo que quieres, ¿verdad?
Puedes hacerlo de una manera ...
... u otro ...
... o el ridículamente más feo de ellos otros ...
fuente