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 次 |
| 最近记录: |