En Scala, las expresiones que describió significan que se invoca un método llamado ?
en un objeto llamado some
. Regularmente, los objetos no tienen un método llamado ?
. Puede crear su propia conversión implícita a un objeto con un método ?
que compruebe null
ness.
implicit def conversion(x: AnyRef) = new {
def ? = x ne null
}
La voluntad por encima, en esencia, convertir cualquier objeto en el que se llama al método ?
en la expresión en el lado derecho del método conversion
(que hace tienen el método ?
). Por ejemplo, si usted hace esto:
"".?
el compilador detectará que un objeto String
no tiene un método ?
, y volver a escribir en:
conversion("").?
ilustrado en un intérprete (tenga en cuenta que se puede omitir .
métodos cuando se llama a objetos):
scala> implicit def any2hm(x: AnyRef) = new {
| def ? = x ne null
| }
any2hm: (x: AnyRef)java.lang.Object{def ?: Boolean}
scala> val x: String = "!!"
x: String = "!!"
scala> x ?
res0: Boolean = true
scala> val y: String = null
y: String = null
scala> y ?
res1: Boolean = false
Así se podría escribir:
if (some ?) {
// ...
}
O bien, podría crear una conversión implícita en un objeto con un método ?
que invoca el método especificado en el objeto si el argumento no es null
- hace esto:
scala> implicit def any2hm[T <: AnyRef](x: T) = new {
| def ?(f: T => Unit) = if (x ne null) f(x)
| }
any2hm: [T <: AnyRef](x: T)java.lang.Object{def ?(f: (T) => Unit): Unit}
scala> x ? { println }
!!
scala> y ? { println }
de modo que usted podría entonces escribir:
some ? { _.toString }
edificio (de forma recursiva) sobre la respuesta del SOC, que puede coincidir con el patrón en x
en los ejemplos anteriores para refinar lo ?
d depende del tipo de x
. : D
IMO, la respuesta de Daniel a continuación es la más adecuada. Scala ya tiene mucho soporte para tratar con valores potencialmente vacíos; es mejor aprender y usar eso que crear una nueva sintaxis '?' Con implícitos. – Bill
Una razón para ir con 'null's en lugar de' None's puede ser el rendimiento/uso de la memoria: es posible que prefiera asignar un objeto efímero de la conversión implícita sobre la marcha en lugar de mantener un contenedor 'Option'. Por supuesto, no muchas personas escriben código de alto rendimiento en la JVM, pero aún así, diría que tiene sus casos de uso. – axel22