Какие методы Scala возвращают значение null вместо параметра и почему?

Интересно, полностью ли стандартная библиотека null -бесплатная и - если нет - будет интересно, какие разумные прецеденты существуют, где возвращение null предпочтительнее возврата некоторого экземпляра Option.

Ответ 1

NamespaceBinding возвращает null для локального пространства имен или в следующем случае undefined.

$ scala
Welcome to Scala version 2.9.0.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_24).
Type in expressions to have them evaluated.
Type :help for more information.

scala> (<foo/>).scope.getURI("something")
res0: String = null

Почему он использует String вместо Option[URI], я не знаю.

Ответ 2

Единственное место, которое я видел null, используемый в стандартной библиотеке, - это необязательные группы регулярных выражений.

scala> val number = """(\d+)(\.\d+)?""".r // matches digits optionally followed by a . and more digits
number: scala.util.matching.Regex = (\d+)(\.\d+)?
scala> "12" match {
     |   case number(intPart, decimalPart) => (intPart, decimalPart)
     | }
res0: (String, String) = (12,null)

Я думаю, рассуждение здесь состоит в том, что вы не хотите использовать Option[String] для всех групп. Это сделает код излишне неуклюжим, если группа не является необязательной. К сожалению, во время компиляции не известно, является ли группа необязательной. Таким образом, это либо Option[String] для всех групп, либо null для не соответствующих групп.

Ответ 3

Я не могу думать ни о чем, поэтому я искал поисковый запрос google в api (inurl: scala -lang.org/api return + null), и он, похоже, не документировал использование null.

Возможно, существует внутреннее использование som. Единственными причинами, которые я могу придумать для этого, было бы избежать дополнительного Some-object или простой интеграции с java. Оба кажутся маловероятными.