gpt4 book ai didi

scala - 构造Option对象: Option(value) vs Some(value)的正确方法

转载 作者:行者123 更新时间:2023-12-04 13:11:07 28 4
gpt4 key购买 nike

初始化Option对象的两种方式的优缺点是什么:

1。

def getAmount: Option[Int] = {
val a: Int = 1
Option(a)
}

2。
def getAmount: Option[Int] = {
val a: Int = 1
Some(a)
}

我应该使用哪个?

最佳答案

有两个重要区别。首先,如果Option的参数为null,则它将返回None:

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

scala> val y: Option[String] = Option(null)
y: Option[String] = None

这可能很有用,但这并不总是您想要的,(同样重要的是)它表明在某些情况下该参数很有可能为null,这可能会引起误解。
Some更适用于您想围绕一个您知道不为空的值生成 Option的情况。不幸的是,第二个区别是 Some(foo)的返回类型是 Some[Whatever],而不是 Option[Whatever],这在某些情况下确实很不方便,在某些情况下,推断出 Some意味着您以后在某些位置尝试使用 NoneOption时会遇到类型错误。在这些情况下,您必须使用 Some(foo): Option[Whatever],这是非常不愉快的。

例如,假设我们有一个表示(希望)整数的字符串列表,并且我们想对其进行解析和求和。如果存在解析错误,我们需要 None,否则,我们需要 Some(total)。以下是使用标准库一次遍历的相当合理的方法:
List("1", "2", "3").foldLeft(Some(0)) {
case (acc, item) => for {
t <- acc
n <- util.Try(item.toInt).toOption
} yield t + n
}

除非这行不通-我们收到类型错误:
<console>:10: error: type mismatch;
found : Option[Int]
required: Some[Int]
t <- acc
^

我们可以通过编写 .foldLeft(Some(0): Option[Int])来解决此问题,但是。

在您的特定示例中,这不是问题,因为返回类型显式为 Option[Int],因此您无需担心类型推断。在这种情况下, Some(a)是正确的选择。

附带说明一下, Scalaz提供了 somenone构造函数,可帮助您避免类型推断问题和诸如 Some(foo): Option[Whatever]之类的嘈杂解决方案:
scala> import scalaz._, Scalaz._
import scalaz._
import Scalaz._

scala> some(10)
res0: Option[Int] = Some(10)

scala> none[Int]
res1: Option[Int] = None

两种返回类型都是 Option,这使得类型推断变得容易得多。如果不想使用Scalaz,可以自己定义这些:
scala> def some[A](a: A): Option[A] = Some(a)
some: [A](a: A)Option[A]

scala> def none[A]: Option[A] = None
none: [A]=> Option[A]

如果使用这些代替 SomeNone,则不必担心会推断出不合适的特定类型。

总结一下:仅在参数可能为null的情况下才使用 Option(foo)(理想情况下仅应用于与Java的互操作性)。在将值明确键入为 Some(foo)的情况下,请使用 Option。如果推断的类型为 Some[Whatever],请添加 : Option[Whatever]类型注释,或使用类似Scalaz的 some的名称。

关于scala - 构造Option对象: Option(value) vs Some(value)的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29579409/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com