views:

91

answers:

1

Is there any particular reason why Regex.MatchData.group(i: Int): java.lang.String returns null rather than Option[String]?

Is there a "Scala Way" to handle nulls in Scala?

+5  A: 

It returns null because it is a shallow interface over the Java library. I think it sucks too, and I have been bitten by it.

If you get a value that may be null, you can write Option(value) on Scala 2.8 and it will become either None or Some(value). That doesn't work with pattern matching, but you can write your own extractor for that:

object Optional {
  def unapply[T](a: T) = if (null == a) Some(None) else Some(Some(a))
}

Examples:

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
Daniel
I always forget to check those object definitions :) The pattern matching example is quite interesting.
Brian Heylin
Only one note: `Option(value)` works in Scala 2.8 only. Not 2.7.x
Alexander Azarov
True enough. I was once better at tagging 2.8 stuff as such.
Daniel