2017-07-04 110 views
0

getOrElse(...) Scala的Option[+A]类的函数签名的默认返回值类型是斯卡拉:Option.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> 

斯卡拉API说,大约getOrElse(...)

如果选项非空,则返回选项的值,否则返回评估结果default

但是() => "Else")未被评估。

o2.getOrElse(() => "Else")() 

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

如何评估的结果,为什么它不会自动计算: 结果不能用括号进行评估?

default: ⇒ B是否与default:() ⇒ B相同?

回答

1
  • 是默认:⇒B中的相同默认:()⇒乙

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

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

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

通过名称呼叫是我搜索的,谢谢! – Jojo

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