Regex.MatchData возвращает null: почему не Option[String]?

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

Есть ли «Scala Way» для обработки нулей в Scala?


person BefittingTheorem    schedule 03.12.2009    source источник


Ответы (1)


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

Если вы получите значение, которое может быть нулевым, вы можете написать 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
person Daniel C. Sobral    schedule 03.12.2009
comment
Я всегда забываю проверять эти определения объектов :) Пример сопоставления с образцом довольно интересен. - person BefittingTheorem; 04.12.2009
comment
Только одно замечание: Option(value) работает только в Scala 2.8. Не 2.7.х - person Alexander Azarov; 04.12.2009
comment
Достаточно верно. Когда-то я лучше помечал вещи 2.8 как таковые. - person Daniel C. Sobral; 04.12.2009