依名稱參數每次使用時都會評估。如果沒有使用,則完全不會評估。這類似於使用傳遞的表達式取代依名稱參數。它們與依值參數相反。若要建立一個依名稱參數,只要在其類型前加上 =>
即可。
def calculate(input: => Int) = input * 37
依名稱參數的優點是,如果它們未用於函式主體中,則不會評估它們。另一方面,依值參數的優點是它們只評估一次。
以下是我們如何實作 while 迴圈的範例
def whileLoop(condition: => Boolean)(body: => Unit): Unit =
if (condition) {
body
whileLoop(condition)(body)
}
var i = 2
whileLoop (i > 0) {
println(i)
i -= 1
} // prints 2 1
def whileLoop(condition: => Boolean)(body: => Unit): Unit =
if condition then
body
whileLoop(condition)(body)
var i = 2
whileLoop (i > 0) {
println(i)
i -= 1
} // prints 2 1
方法 whileLoop
使用多個參數清單來取得迴圈的條件和主體。如果 condition
為 true,則會執行 body
,然後遞迴呼叫 whileLoop。如果 condition
為 false,則永遠不會評估主體,因為我們在 body
的類型前加上 =>
。
現在,當我們傳遞 i > 0
作為我們的 condition
,以及 println(i); i-= 1
作為 body
時,它會像許多語言中的標準 while 迴圈一樣運作。
延遲評估參數直到使用它的能力,如果參數在評估上需要大量運算或像擷取 URL 這樣執行時間較長的程式碼區塊,則有助於提升效能。