在 Scala 中,当我想将某些内容设置为 None
时,我有几个选择:使用 None
或 Option.empty[A]
.
我应该只选择一个并始终如一地使用它,还是有时我应该使用一个而不是另一个?
例子:
scala> def f(str: Option[String]) = str
f: (str: Option[String])Option[String]
scala> f(None)
res0: Option[String] = None
scala> f(Option.empty)
res1: Option[String] = None
最佳答案
我会坚持 None
只要有可能,这几乎总是如此。它更短且使用广泛。 Option.empty
允许您指定底层值的类型,因此当您需要帮助类型推断时使用它。如果编译器已知该类型 None
会按预期工作,但是在定义新变量时
var a = None
会导致推断
a
如 None.type
这不太可能是您想要的。然后,您可以使用以下两种方法之一来帮助推断您需要什么
@ var a = Option.empty[String]
a: Option[String] = None
@ var a: Option[String] = None
a: Option[String] = None
@ var a = None: Option[String] // this one is rather uncommon
a: Option[String] = None
编译器需要帮助的另一个地方:
List(1, 2, 3).foldLeft(Option.empty[String])((a, e) => a.map(s => s + e.toString))
(代码没有意义,只是作为示例)如果您要省略类型,或将其替换为
None
累加器的类型将被推断为 Option[Nothing]
和 None.type
分别。就我个人而言,这是我会去的地方
Option.empty
,对于其他情况,我坚持使用 None
只要有可能。
关于scala - 什么时候应该使用 Option.empty[A] ,什么时候应该在 Scala 中使用 None ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36257132/