Scala:默认返回类型为 Option.getOrElse(..)



ScalaOption[+A]类的函数getOrElse(...)的签名为

final def getOrElse[B >: A](default: ⇒ B): B

如果我使用示例

val o1 = Option("Hi")
val o2: Option[String] = Option(null)
println(o1.getOrElse(() => "Else"))
println(o2.getOrElse(() => "Else"))

我得到输出

Hi
<function0>

Scala API 说getOrElse(...)

如果选项为非空,则返回选项的值,否则返回计算结果default

() => "Else")没有被评估。 不能使用括号计算结果:

o2.getOrElse(() => "Else")()
error: Object does not take parameters
o2.getOrElse( () => "Else")()
^

如何评估结果以及为什么不自动评估结果?

default: ⇒ Bdefault: () ⇒ B一样吗?

  • 默认值:⇒ B 与默认值相同:(( ⇒ B

不,第一个是叫名字,第二个是笨蛋。按名称调用参数的类型是参数本身的类型,其中 thunk 的类型是() => T这与Function0[T]相同。

当你这样做o1.getOrElse(() => "Else")你正在使用异构类型,所以Scala会发现最不常见的超类型,在这种情况下是Any

val orElse: Any = o1.getOrElse(() => "Else") 

考虑一下:

val e: Function0[String] = () => "Else"

然后你可以写:

println(o1.getOrElse(e)) //Hi
println(o2.getOrElse(e)) //<function0>
println(o2.getOrElse(e())) //Else
println(o2.getOrElse((() => "Else")())) //Else

最新更新