scala如果你想實現像if ,while等類似的控制結構,根本沒有值要傳入花括弧{}直接的代碼里。要怎麼實現。 比如說,我們要實現一個斷言的控制結構,myAssert(), myAssert函數參考自帶參數和一個標示變數,如果標示位為false,則什麼都不做,如果為true則進行正常判斷。 下麵是
scala如果你想實現像if ,while等類似的控制結構,根本沒有值要傳入花括弧{}直接的代碼里。要怎麼實現。
比如說,我們要實現一個斷言的控制結構,myAssert(), myAssert函數參考自帶參數和一個標示變數,如果標示位為false,則什麼都不做,如果為true則進行正常判斷。
下麵是一種合理的實現:
val assertionEnable = true def myAssert( predicate: () => Boolean) = if(assertionEnable && ! predicate()) throw new AssertionError //myAssert函數的定義是合法的,也實現了這個功能,但是使用者的代碼比較難看, myAssert( () => 5>3) //省略函數字面量的參數列表()和 =>之後,就比較好了。 // myAssert( 5>3) //不會有效,因為缺少 () =>
省略函數字面量的參數列表()和 =>之後,就比較好了,但是會報編譯錯誤。
scala的傳名參數可以實現我們的願望,傳名參數的定義:要開始於=> 而不是 () => ;這樣就可以實現我們的
需求。定義了傳名參數的函數就是傳名函數。
def byNameAssert( predicate: => Boolean) = if(assertionEnable && ! predicate) throw new AssertionError byNameAssert(5>3) //有效