Scala Some v.选项

Kev*_*ith 28 scala

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
Run Code Online (Sandbox Code Playgroud)

我看到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)
                                     ^
Run Code Online (Sandbox Code Playgroud)

Mic*_*jac 22

好吧,Some扩展Option,所以它继承除了getisEmpty(和案例类实现的一些其他方法)之外的一切.

伴随对象Option有一个特殊apply的处理方法null:

def apply[A](x: A): Option[A] = if (x == null) None else Some(x)
Run Code Online (Sandbox Code Playgroud)

但这Some.apply只是apply为案例类生成的标准方法.

Some(null) 在某些情况下编译,但它具有类型Some[Null](或Option[Null]),只有当类型参数Option为引用类型时才能分配.

scala> val a = Some(null)
a: Some[Null] = Some(null)

scala> val b: Option[String] = Some(null)
b: Option[String] = Some(null)
Run Code Online (Sandbox Code Playgroud)

你想分配Some[Null]到一个Option[Boolean],但Null不是一个子类Boolean,因为Boolean是值类型(primitive下),不能容纳的值null.


Ash*_*ish 19

简而言之

           Option
            /   \
           /     \
          /       \
        Some     None
Run Code Online (Sandbox Code Playgroud)

选项是容器基础,可以是空的或完整的

虽然Some(x)表示容器中存在'x',但None表示空.


小智 17

从函数编程的角度来看,给定任意类型T,类型Option [T]是一个代数数据类型,数据构造函数为None和Some(x:T).
这只是一种编码方式,如果类型T由值t1,t2,t3,...组成,那么Option [T]类型的所有值都是None,Some(t1),Some(t2),一些(t3),......

其他大部分内容都来自于此.例如,如果null不是T的值,则Some(null)不是Option [T]的值.这解释了原因

val x: Option[Boolean] = Some(null)
Run Code Online (Sandbox Code Playgroud)

不起作用,而

val x: Option[Null] = Some(null)
Run Code Online (Sandbox Code Playgroud)

确实.

最后,特别是对Scala来说,似乎还有一个额外的怪癖,"为方便起见",当他们的意思是无时,可以说Option(null).我希望当他们的意思是Some(t)时,也可以说Option(t).