Some
和Option
之间的区别是什么?
scala> Some(true)
res2: Some[Boolean] = Some(true)
scala> val x: Option[Boolean] = Some(true)
x: Option[Boolean] = Some(true)
scala> res2 == x
res3: Boolean = true
我看到Option(null)
返回,而Some(null)
无法编译:
scala> val x = Option(null)
x: Option[Null] = None
scala> val x: Option[Boolean] = Some(null)
<console>:7: error: an expression of type Null is ineligible for implicit conversion
val x: Option[Boolean] = Some(null)
^
答案 0 :(得分:19)
好吧,Some
扩展了Option
,因此它继承了除get
和isEmpty
以外的所有内容(以及案例类实现的其他一些方法)。
Option
的伴随对象有一个特殊的apply
方法来处理null
:
def apply[A](x: A): Option[A] = if (x == null) None else Some(x)
但Some.apply
只是为案例类生成的标准apply
方法。
Some(null)
将在某些情况下进行编译,但它具有Some[Null]
(或Option[Null]
)类型,只能在{的类型参数时分配{1}}是引用类型。
Option
您尝试将scala> val a = Some(null)
a: Some[Null] = Some(null)
scala> val b: Option[String] = Some(null)
b: Option[String] = Some(null)
分配给Some[Null]
,但Option[Boolean]
不是Null
的子类型,因为Boolean
是值类型(下面的基元),不能包含值Boolean
。
答案 1 :(得分:16)
从函数式编程的角度来看,给定任意类型T,类型Option [T]是一个代数数据类型,数据构造函数为None和Some(x:T)。
这只是一种编码方式,如果类型T由值t1,t2,t3,...组成,
那么 all 类型Option [T]的值是None,Some(t1),Some(t2),Some(t3),...
其他大部分内容都来自于此。例如,如果null不是T的值,则Some(null)不是Option [T]的值。这解释了为什么
val x: Option[Boolean] = Some(null)
不起作用,而
val x: Option[Null] = Some(null)
一样。
最后,特别是对Scala来说,似乎还有一个额外的怪癖,为方便起见,#34;当他们的意思是无时,可以说Option(null)。我希望当他们的意思是Some(t)时,也可以说Option(t)。
答案 2 :(得分:15)
简而言之
Option
/ \
/ \
/ \
Some None
选项是容器库,可以是空的或完整的
虽然有些(x)表示完整的&#39; x&#39;存在于容器中,None表示空。
答案 3 :(得分:2)
Option的基本思想是消除使用Null以便有一个默认值并避免NullPointerException。因此Option可以有一些值或None(替换Null)。查看选项的这个很好的解释: Scala Option explained