【发布时间】:2013-08-24 21:50:40
【问题描述】:
以下是 Scala 中的有效语句:
scala> var x: Option[Int] = Some(3)
x: Option[Int] = Some(3)
scala> var x: Option[Int] = None
x: Option[Int] = None
以下内容无效:
scala> var x: Option[Int] = 3
<console>:7: error: type mismatch;
found : Int(3)
required: Option[Int]
var x: Option[Int] = 3
到目前为止,这些例子对我来说是有意义的; Option[T] 类型的值可以是 Some[T] 或 None 类型,因此编译器会阻止您分配这两种类型的值。
然而,Scala 编译器似乎接受了这一点:
scala> val x: Option[Int] = null
x: Option[Int] = null
如果我随后尝试对选项进行模式匹配(例如,如下所示),我会遇到意想不到的失败 - 为什么编译器不通过拒绝 null 的分配来保护我免受这种情况的影响?
x match {
case Some(y) => println("Number: ", y)
case None => println("No number")
}
【问题讨论】:
-
任何引用都可以为空;这只是在 JVM 上运行的不幸后果。
-
感谢克里斯托弗!我刚刚读到this article,上面写着“当然,这些都不能让你摆脱 null,因为 Scala 非常乐意将 null 分配给任何东西。这有点让整个事情看起来有点毫无意义。”有点令人失望;我一直假设 Option (Some/None) 匹配模式是完整的,但实际上要完整,我想你需要匹配 Some / None / null,并进一步检查你从 Some 获得的值。
-
在进一步阅读之后,我想我理解得更好了。选项更多的是传达程序员的意图,即某个方法可能返回值或不返回值。如果被调用的代码表现良好,则调用者不需要显式处理 null ,因为调用者并不期望它。正如here 所提到的,“我认识的所有 Scala 开发人员的经验是,NPE 在处理现有 Java 库时大多只是一个问题,因为 Scala 程序员和库会避免它。”
标签: scala