有些(x)比Option(x)有用吗?

时间:2015-08-24 18:04:27

标签: scala functional-programming optional

因此,在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为null,那么它们的行为会有所不同。

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

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

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

所以看起来,除非你想保留null(无论出于何种原因),Option(x)总是更可取,因为它更安全。

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

我的问题:除了保留null之外,有没有理由使用Some(x)

3 个答案:

答案 0 :(得分:3)

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

  1. 它让你意识到你在函数中返回的内容。让我们假设您有一个可能返回空值的函数。您想为此使用Option。您应该以这样一种方式编写代码,以便了解自己是否返回NoneSome,否则您可能不知道发生了什么,而且您已经&#39 ;依靠Option的构造为你做这项工作,这可能不符合你的期望。

  2. 使用match语句时,您需要有区别,以便能够在SomeNone之间进行选择,因为这是整个问题的关键所在。使用Option

  3. 示例:

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

答案 1 :(得分:0)

当您进行大小写匹配并且您希望匹配时,某个值实际上是某个(值)而不是无

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

中出现的空检查

答案 2 :(得分:0)

根据我的理解,不建议在Scala中直接使用null,这就是为什么引入Option / Some / None的原因。有些(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)