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
,所以它继承除了get
和isEmpty
(和案例类实现的一些其他方法)之外的一切.
伴随对象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).
归档时间: |
|
查看次数: |
15302 次 |
最近记录: |