因此,在Scala中Some
和None
是Option
的两个子类。
要获取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)
?
答案 0 :(得分:3)
使用它有几个不同的原因:
它让你意识到你在函数中返回的内容。让我们假设您有一个可能返回空值的函数。您想为此使用Option
。您应该以这样一种方式编写代码,以便了解自己是否返回None
或Some
,否则您可能不知道发生了什么,而且您已经&#39 ;依靠Option
的构造为你做这项工作,这可能不符合你的期望。
使用match
语句时,您需要有区别,以便能够在Some
和None
之间进行选择,因为这是整个问题的关键所在。使用Option
。
示例:
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)