Scala Regex.MatchData返回null:为什么不选择选项[String]?

Scala Regex.MatchData返回null:为什么不选择选项[String]?,scala,null,nullreferenceexception,Scala,Null,Nullreferenceexception,Regex.MatchData.group(i:Int):java.lang.String返回null而不是Option[String]有什么特别的原因吗 是否有一种“Scala方式”来处理Scala中的空值?它返回空值,因为它是Java库上的浅层接口。我觉得它也很糟糕,我被它咬了 如果您得到的值可能为空,您可以在Scala 2.8上写入选项(值),它将变为None或Some(值)。这不适用于模式匹配,但您可以为此编写自己的提取器: object Optional { def unapply

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


是否有一种“Scala方式”来处理Scala中的空值?

它返回空值,因为它是Java库上的浅层接口。我觉得它也很糟糕,我被它咬了

如果您得到的值可能为空,您可以在Scala 2.8上写入
选项(值)
,它将变为
None
Some(值)
。这不适用于模式匹配,但您可以为此编写自己的提取器:

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

我总是忘记检查那些对象定义:)模式匹配示例非常有趣。只有一个注意事项:
Option(value)
仅适用于Scala 2.8。还不够。我曾经更擅长标记2.8之类的东西。