在 Option(x) 上是否使用 Some(x)?

Is there any use of Some(x) over Option(x)?

所以在Scala中SomeNoneOption的两个子类。

要获取 Some 的实例,您可以同时执行 Some(x)Option(x)

scala> val x = "Foo"
x: String = Foo

scala> Some(x)
res0: Some[String] = Some(Foo)

scala> Option(x)
res1: Option[String] = Some(Foo)

所以看起来差别不大。 但是当然,如​​果 x 为空,那么它们的行为就会不同。

scala> val x:String = null
x: String = null

scala> Some(x)
res0: Some[String] = Some(null)

scala> Option(x)
res1: Option[String] = None

看起来,除非您想保留空值(无论出于何种原因),否则 Option(x) 总是更可取,因为它更安全。

即使使用文字,虽然我们确定 Some("foo") 不能产生 null,但如果稍后将字符串提取到变量中,您必须将其更改为 Option 以确保安全。

我的问题:除了保留 null,还有什么理由使用 Some(x)

当您进行大小写匹配时,您想要匹配的值实际上是 Some(value) 而不是 None

在很多情况下,您确定某个特定值不会为空,而您宁愿跳过 Option.apply

中发生的空检查

使用它有几个不同的原因:

  1. 它让您意识到您在函数中 return 正在做什么。假设您有一个可能 return 空值的函数。你想为此使用 Option。您应该以这样一种方式编写您的代码,即您知道您是 return 是 None 还是 Some,否则您可能不知道发生了什么,并且您依赖关于 Option 为您完成这项工作的构造,这可能不会达到您的预期。

  2. 当使用 match 语句时,您需要有区别才能在 SomeNone 之间进行选择,因为这就是使用 Option.

示例:

val k: Option[Int] = someFunctionThatMightReturnInvalid()
k match {
    case Some(x) => println(x)
    case None => println("value is invalid")
}

据我了解,在Scala中不建议直接使用null,这也是引入Option/Some/None的原因。 Some(null) 与 Option(null) 不同,但我看不出它有什么用。因此 "Some" 仅在现实生活中的模式匹配中有用,如先前的答案所述。

此外,如果您有机会学习 Scalaz,它是 scala 的函数库,它引入了 "some",它的行为类似于标准 scala 中的 Option。

scala> import scalaz._; import Scalaz._
import scalaz._
import Scalaz._

scala> 2.some
res18: Option[Int] = Some(2)

scala> some(2)
res19: Option[Int] = Some(2)