Scala Some v.选项

 feloveyu 发布于 2022-12-04 01:55

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,所以它继承除了getisEmpty(和案例类实现的一些其他方法)之外的一切.

伴随对象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.

3 个回答
  • 从函数编程的角度来看,给定任意类型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).

    2022-12-11 02:06 回答
  • 好吧,Some扩展Option,所以它继承除了getisEmpty(和案例类实现的一些其他方法)之外的一切.

    伴随对象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.

    2022-12-11 02:09 回答
  • 简而言之

               Option
                /   \
               /     \
              /       \
            Some     None
    

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

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

    2022-12-11 02:14 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有