通常情況下,函式的引數是傳值引數;即引數的值在它被傳遞給函式之前被確定。但是,如果我們需要編寫乙個接收引數不希望馬上計算,直到呼叫函式內的表示式才進行真正的計算的函式。對於這種情況,scala提供按名稱引數呼叫函式。
示例**如下:
結果:在**中,如果定義函式的時候,傳入引數不是傳入的值,而是傳入的引數名稱(如**中使用t: => long而不是t: long),在呼叫該函式時,不會立即執行和引數有關的計算,而是到引數真正使用到的時候才進行計算。
結果說明:主函式呼叫delayed函式後,並不立即執行引數(time()函式的結果),而是跳過,直接執行delayed函式的第一行,到第二行真正使用到t時,才執行time()函式獲取t的值,故有上述結果。
如果將t: => long改成t: long,則按照值傳遞進行計算,結果如下:
此時主函式呼叫了delayed函式後就直接先執行time()函式獲取t的值
另乙個示例**如下:
這裡呼叫了乙個log函式,傳入的引數中有1/0,按理說應該會報異常,但實際結果卻是**順利的執行完成。為什麼呢?這是因為我們在定義log函式的時候使用了「按名稱傳遞引數」,只有到實際執行引數相關的計算時才會檢查是否有異常。而**中if(logenable) println(msg)這一行**實際根本就不會執行,自然也就不會存在檢查異常的問題了
如果將msg: =>string改為msg: string,則執行**就會報錯
因為在執行到log(msg +1 / 0)這一句時就直接計算了1/0,自然就會報錯了
使用「按名稱傳遞引數」方式的優點是:1.減少不必要的計算;2.減少異常
Scala函式特性系列 高階函式
帶函式引數的函式由於是乙個接受函式引數的函式,故被稱為 高階函式,像之前講到的 map 函式就是高階函式。如下例所示 上述 中,函式接受乙個函式 f作為引數,接受乙個 int型別的引數,進行 f v 運算,在下面又給出了 f具體的定義 layout 函式 同樣的,高階函式也可以產出另乙個函式 即返回...
Scala學習筆記 函式特性
一 傳名與傳值的區別 在進入函式內部前,傳值呼叫方式就已經將引數表示式的值計算完畢,而傳名呼叫是在函式內部進行引數表示式的值計算的。這就造成一種現象,每次使用傳名呼叫時,直譯器都會計算一次表示式值。二 引數傳遞的時候也具有指定引數名的能力。三 scala允許指明函式的最後乙個引數可以是重複的,即我們...
scala 傳名函式和傳值函式
scala的直譯器在解析函式引數 function arguments 時有兩種方式 先計算引數表示式的值 reduce the arguments 再應用到函式內部 或者是將未計算的引數表示式直接應用到函式內部。前者叫做傳值呼叫 call by value 後者叫做傳名呼叫 call by nam...