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

时间:2017-07-04 07:44:41

标签: scala types

Scala的Option[+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相同吗?

2 个答案:

答案 0 :(得分:1)

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

不,第一个是按名称呼叫,第二个是thunk。 name by name参数的类型是参数本身的类型,其中thunk的类型为() => T,与Function0[T]相同。

执行o1.getOrElse(() => "Else")时,您正在使用异构类型,因此Scala会找到最不常见的超类型,在这种情况下为Any

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

答案 1 :(得分:0)

考虑一下:

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