轉自:http://blog.csdn.net/shenxiaoming77/article/details/54835679函數
一般狀況下,函數的參數是傳值參數;即參數的值在它被傳遞給函數以前被肯定。可是,若是咱們須要編寫一個接收參數不但願立刻計算,直到調用函數內的表達式才進行真正的計算的函數。對於這種狀況,Scala提供按名稱參數調用函數。spa
示例代碼以下:.net
結果:blog
在代碼中,若是定義函數的時候,傳入參數不是傳入的值,而是傳入的參數名稱(如代碼中使用t: => Long而不是t: Long),在調用該函數時,不會當即執行和參數有關的計算,而是到參數真正使用到的時候才進行計算。get
結果說明:主函數調用delayed函數後,並不當即執行參數(time()函數的結果),而是跳過,直接執行delayed函數的第一行,到第二行真正使用到t時,才執行time()函數獲取t的值,故有上述結果。im
若是將t: => Long改爲t: Long,則按照值傳遞進行計算,結果以下:異常
此時主函數調用了delayed函數後就直接先執行time()函數獲取t的值margin
另外一個示例代碼以下:top
這裏調用了一個log函數,傳入的參數中有1/0,按理說應該會報異常,但實際結果倒是代碼順利的執行完成。爲何呢?這是由於咱們在定義log函數的時候使用了「按名稱傳遞參數」,只有到實際執行參數相關的計算時纔會檢查是否有異常。而代碼中if(logEnable) println(msg)這一行代碼實際根本就不會執行,天然也就不會存在檢查異常的問題了img
若是將msg: =>String改成msg: String,則執行代碼就會報錯
由於在執行到log(MSG +1 / 0)這一句時就直接計算了1/0,天然就會報錯了
使用「按名稱傳遞參數」方式的優勢是:1.減小沒必要要的計算; 2.減小異常