¿Existe alguna razón particular por la cual Regex.MatchData.group (i: Int): java.lang.String devuelva null en lugar de Option [String]?Regex.MatchData que devuelve nulo: ¿por qué no Opción [String]?
¿Hay un "modo Scala" para manejar nulos en Scala?
¿Existe alguna razón particular por la cual Regex.MatchData.group (i: Int): java.lang.String devuelva null en lugar de Option [String]?Regex.MatchData que devuelve nulo: ¿por qué no Opción [String]?
¿Hay un "modo Scala" para manejar nulos en Scala?
Devuelve nulo porque es una interfaz poco profunda sobre la biblioteca de Java. Creo que apesta también, y me ha mordido.
Si obtiene un valor que puede ser nulo, puede escribir Option(value)
en Scala 2.8 y se convertirá en None
o Some(value)
. Eso no funciona con la coincidencia de patrones, pero usted puede escribir su propia extractora para ello:
object Optional {
def unapply[T](a: T) = if (null == a) Some(None) else Some(Some(a))
}
Ejemplos:
scala> val a:String = null
a: String = null
scala> a match {
| case Optional(None) => println("Got none")
| case Optional(Some(value)) => println("Got "+value)
| }
Got none
scala> val a = "string"
a: java.lang.String = string
scala> a match {
| case Optional(None) => println("Got none")
| case Optional(Some(value)) => println("Got "+value)
| }
Got string
scala> val a = "5"
a: java.lang.String = 5
scala> a match {
| case Optional(None) => println("Got none")
| case Optional(Some(value)) => println("Got "+value.toInt)
| }
Got 5
siempre olvido para comprobar esas definiciones de objetos :) El ejemplo de coincidencia de patrones es bastante interesante. –
Solo una nota: 'Opción (valor)' funciona solo en Scala 2.8. No 2.7.x –
Cierto. Una vez fui mejor etiquetando 2.8 cosas como tal. –