Scala Some v。选项

时间:2014-12-23 18:44:58

标签: scala

SomeOption之间的区别是什么?

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)
                                     ^

4 个答案:

答案 0 :(得分:19)

好吧,Some扩展了Option,因此它继承了除getisEmpty以外的所有内容(以及案例类实现的其他一些方法)。

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