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: ⇒ B
与default: () ⇒ B
相同吗?
答案 0 :(得分:1)
不,第一个是按名称呼叫,第二个是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