2017-07-04 140 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