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: ⇒ B
和default: () ⇒ 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