为什么Regex.MatchData返回null而不是Option[String]?

10

为什么Regex.MatchData.group(i: Int): java.lang.String返回null而不是Option[String]?是否有特定的原因?

在Scala中是否有处理null的“Scala Way”?

1个回答

9

它返回null是因为它只是Java库的浅层接口。我认为这很糟糕,而且我也被它咬过。

如果你得到一个可能为null的值,你可以在Scala 2.8上写Option(value),它将变成NoneSome(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

我总是忘记检查那些对象定义 :) 模式匹配的例子非常有趣。 - BefittingTheorem
只有一个注意事项:Option(value) 仅适用于 Scala 2.8,而不适用于 2.7.x。 - Alexander Azarov
足够正确。我曾经更擅长将2.8的标签标记为这样的东西。 - Daniel C. Sobral

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接