Scala 按名稱參數調用函數 與 =>的用法

轉自: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.減小異常

相關文章
相關標籤/搜索