示例來源於programming in scala函數
先看一個例子:ui
scala> def myAssert(predicate: () => Boolean) = { | if (predicate()) println("true") | else println("false") | } myAssert: (predicate: () => Boolean)Unit scala> myAssert { | () => 5 > 3 | } true scala> myAssert { | 5 > 3 | } <console>:14: error: type mismatch; found : Boolean(true) required: () => Boolean 5 > 3
調用函數myAssert
時,當直接傳5 > 3
給它時會報錯,緣由是由於這個函數的定義使用的是傳值。也就是說會先將表達式5 > 3
計算出結果,而後將結果傳給函數myAssert
。若是想要傳遞5 > 3
這個表達式,就要使用傳名參數。scala
scala> def myAssert(predicate: => Boolean) { | if (predicate) println("true") | else println("false") | } myAssert: (predicate: => Boolean)Unit scala> myAssert { | println("Hello") | 5 > 3 | } Hello true
也就是說,傳名參數,適用於參數類型是無參函數的狀況,而且使用時須要將圓括號去掉:predicate: => Boolean
。此時在調用函數時,就不會使用傳值參數,而是會把花括號中的部分包裹成一個匿名函數,以函數值的形式做爲參數傳遞下去。這樣作的結果就是使用起來跟內建的控制結構同樣。code