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):7: error: an expression of type Null is ineligible for implicit conversion val x: Option[Boolean] = Some(null) ^
Michael Zaja.. 22
好吧,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]
),只有当类型参数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
是值类型(primitive下),不能容纳的值null
.
从函数编程的角度来看,给定任意类型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)
不起作用,而
val x: Option[Null] = Some(null)
确实.
最后,特别是对Scala来说,似乎还有一个额外的怪癖,"为方便起见",当他们的意思是无时,可以说Option(null).我希望当他们的意思是Some(t)时,也可以说Option(t).
好吧,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]
),只有当类型参数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
是值类型(primitive下),不能容纳的值null
.
简而言之
Option / \ / \ / \ Some None
选项是容器基础,可以是空的或完整的
虽然Some(x)表示容器中存在'x',但None表示空.