首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala,Some诉Option

Scala,Some诉Option
EN

Stack Overflow用户
提问于 2014-12-23 18:44:57
回答 4查看 24.9K关注 0票数 39

SomeOption有什么区别?

代码语言:javascript
复制
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)不会编译:

代码语言:javascript
复制
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)
                                     ^
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-12-23 18:57:45

嗯,Some扩展了Option,因此它继承了除getisEmpty之外的所有东西(以及其他一些由case类实现的方法)。

Option的伴随对象有一种特殊的处理nullapply方法。

代码语言:javascript
复制
def apply[A](x: A): Option[A] = if (x == null) None else Some(x)

但是Some.apply只是为case类生成的标准apply方法。

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

代码语言:javascript
复制
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是值类型(下面是原语),不能保存null的值。

票数 33
EN

Stack Overflow用户

发布于 2014-12-26 11:33:56

总之

代码语言:javascript
复制
           Option
            /   \
           /     \
          /       \
        Some     None

选项是容器库,可以是空的或满的。

虽然有些(X)表示容器中的“x”是满的,但没有一个表示空。

票数 31
EN

Stack Overflow用户

发布于 2014-12-23 19:15:09

从函数编程的角度来看,给定任意类型的T,类型OptionT是一种代数数据类型,其数据构造函数为None和Some(x:T)。

这仅仅是一种编码方式,如果类型T由值t1、t2、t3、.那么OptionT类型的所有值都是None、Some(t1)、Some(t2)、Some(t3)、.

大多数其他的事情都是从这个开始的。例如,如果null不是T的值,那么一些(Null)不是OptionT的值。这就解释了为什么

代码语言:javascript
复制
val x: Option[Boolean] = Some(null)

不起作用

代码语言:javascript
复制
val x: Option[Null] = Some(null)

确实如此。

最后,对于Scala来说,似乎还有另外一个奇怪之处,“为了方便”,当选项(Null)的意思是“None”时,人们可能会说它为“null”。我希望人们也可以说选项(T),当它们指的是一些(T)。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27626237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档