在 Option(x) 上是否使用 Some(x)?
Is there any use of Some(x) over Option(x)?
所以在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 为空,那么它们的行为就会不同。
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
中发生的空检查
使用它有几个不同的原因:
它让您意识到您在函数中 return 正在做什么。假设您有一个可能 return 空值的函数。你想为此使用 Option
。您应该以这样一种方式编写您的代码,即您知道您是 return 是 None
还是 Some
,否则您可能不知道发生了什么,并且您依赖关于 Option
为您完成这项工作的构造,这可能不会达到您的预期。
当使用 match
语句时,您需要有区别才能在 Some
和 None
之间进行选择,因为这就是使用 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)
所以在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 为空,那么它们的行为就会不同。
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
使用它有几个不同的原因:
它让您意识到您在函数中 return 正在做什么。假设您有一个可能 return 空值的函数。你想为此使用
Option
。您应该以这样一种方式编写您的代码,即您知道您是 return 是None
还是Some
,否则您可能不知道发生了什么,并且您依赖关于Option
为您完成这项工作的构造,这可能不会达到您的预期。当使用
match
语句时,您需要有区别才能在Some
和None
之间进行选择,因为这就是使用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)