【问题标题】:Scala Some v. OptionScala Some v. 选项
【发布时间】:2014-12-23 18:44:57
【问题描述】:

SomeOption 有什么区别?

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)
<console>:7: error: an expression of type Null is ineligible for implicit conversion
       val x: Option[Boolean] = Some(null)
                                     ^

【问题讨论】:

标签: scala


【解决方案1】:

好吧,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 是值类型(下面是原始类型)并且不能保持null 的值。

【讨论】:

  • 昨天关于盒装基元与 null 的交集的问题:stackoverflow.com/q/27611133/1296806 你可能会告诉我们为什么 null.asInstanceOf[Int] 是零(按照规范),但预期的盒装类型会将它变成 null 而不是盒装的零。或者,Some(null) map (runtime.BoxesRunTime.unboxToInt) 为零。
【解决方案2】:

总之

           Option
            /   \
           /     \
          /       \
        Some     None

选项是容器底座,可以是空的或满的

虽然 Some(x) 表示容器中存在“x”且已满,但 None 表示空。

【讨论】:

    【解决方案3】:

    从函数式编程的角度来看,给定任意类型 T,类型 Option[T] 是具有数据构造函数 None 和 Some(x:T) 的代数数据类型。
    这只是一种编码方式,如果类型 T 由值 t1, t2, t3, ... 那么所有 Option[T] 类型的值为 None, Some(t1), Some(t2), Some(t3), ...

    其他大部分内容都由此而来。例如,如果 null 不是 T 的值,则 Some(null) 不是 Option[T] 的值。这就解释了为什么

    val x: Option[Boolean] = Some(null)
    

    不起作用,而

    val x: Option[Null] = Some(null)
    

    确实如此。

    最后,特别是对于 Scala,似乎还有一个额外的怪癖,“为了方便”,当他们的意思是 None 时,人们可能会说 Option(null)。我希望人们也可以说 Option(t) 当他们的意思是 Some(t)。

    【讨论】:

      【解决方案4】:

      Option 的基本思想是消除使用 Null 以获得默认值并避免 NullPointerException。所以 Option 可以有一些值或无(替换 Null)。看看这个对 Option 的精彩解释: Scala Option explained

      【讨论】:

        猜你喜欢
        • 2020-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-18
        • 1970-01-01
        • 2012-02-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多