【问题标题】:Which Scala methods return null instead of an Option and why?哪些 Scala 方法返回 null 而不是 Option,为什么?
【发布时间】:2011-09-05 01:54:57
【问题描述】:

我想知道标准库是否完全是 null-free 并且 - 如果不是 - 会感兴趣存在哪些合理的用例,其中返回 null 比返回一些 Option 实例更可取。

【问题讨论】:

  • 返回null 的唯一合理用例是当您使用的库期望从回调中返回null 作为“无结果”的指示时。在处理来自 Scala 代码的遗留 Java 库时,这通常是必要的。
  • 一般来说,Scala 库方法要么返回 Option,要么在调用不当时抛出异常(例如,head 和 last on list)。我不知道有什么返回 null。

标签: scala methods null standard-library scala-option


【解决方案1】:

NamespaceBinding 为本地命名空间返回 null,或者在以下情况下为未定义的输入。

$ 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]

【讨论】:

  • scala.xml.Elem 相关,它采用String 前缀值,对于没有命名空间前缀,该值应为null。再说一次,为什么不是Option[String] 我无法理解。
【解决方案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 用于不匹配的组。

【讨论】:

  • 我真的很喜欢正则表达式自动成为模式匹配器的事实,以及对于 90% 的情况你想要直接的 String;但由于 Scala 几乎完全没有奇怪的异常,所以如果他们使用Option[String] 来保持一致性可能是个好主意。 Option[String] 和/或 List 在解析 Json 时经常出现,我认为我不太在意它们,因为我会在理解范围内使用它们。
  • @Eugene 提示:如果您指定类型,则它不会匹配 null。例如,case number(intPart: String, decimalPart: String) 不会匹配上面的字符串。
【解决方案3】:

我想不出任何东西,所以我在 api 中进行了谷歌搜索(inurl:scala-lang.org/api return +null),它似乎没有产生任何有据可查的 null 使用。

可能存在一些内部使用。我能想到这样做的唯一原因是避免额外的 Some-object 或轻松与 java 集成。两者似乎都不太可能。

【讨论】:

  • 由于 Scala 大部分时间不使用 return,因此该搜索不会真正捕获太多。
猜你喜欢
  • 2021-07-05
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多