10

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

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

4

1 回答 1

9

它返回 null 因为它是 Java 库上的浅接口。我也觉得它很烂,我已经被它咬了。

如果你得到一个可能为 null 的值,你可以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
于 2009-12-03T21:44:18.507 回答