Регулярное выражение.MatchData, возвращающий null: почему не Option [String]?


Есть ли какая-то особая причина, по которой регулярное выражение.MatchData.группа (i: Int): java.яз..String возвращает null, а не Option [String]?

Существует ли "способ Scala" для обработки нулей в Scala?

1 9

1 ответ:

Он возвращает null, потому что это неглубокий интерфейс над библиотекой Java. Я думаю, что это тоже отстой, и я был укушен им.

Если вы получаете значение, которое может быть null, вы можете написать Option(value) на Scala 2.8, и оно станет либо None, либо Some(value). Это не работает с сопоставлением шаблонов, но вы можете написать свой собственный экстрактор для этого:

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

Примеры:

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