函數值對消除代碼重覆有很大的幫助。但是像函數值這樣直接將一個函數作為另一個函數的參數卻不太利於函數值本身的重用。 來看一個例子: class Equipment(val routine: Int => Int) { def simulate(input: Int) = { print("Runnin... ...
函數值對消除代碼重覆有很大的幫助。但是像函數值這樣直接將一個函數作為另一個函數的參數卻不太利於函數值本身的重用。
來看一個例子:
class Equipment(val routine: Int => Int) { def simulate(input: Int) = { print("Running simulation...") routine(input) } }
在這個例子里將函數值作為參數傳到了構造器中。
看一下如何使用:
val equipment1 = new Equipment({input=>println("calc with " + input); input}) val equipment2 = new Equipment(input=>{println("calc with " + input); input}) equipment1.simulate(4) equipment1.simulate(6)
執行結果如下:
上面的代碼中還是出現了重覆代碼。新建實例equipment1和equipment2時,向Equipment構造函數中傳遞的函數值是一樣的。要避免這樣的函數值重覆,可以將函數值賦給一個val,然後調用的時候直接使用val。就像下麵這樣:
val calculate = { input: Int => println("calc with " + input); input } val equipment1 = new Equipment(calculate) val equipment2 = new Equipment(calculate) equipment1.simulate(4) equipment1.simulate(6)
這裡將函數值保存在一個val引用calculate中。請註意下,在這裡需要聲明函數值參數的類型。在之前是不需要的。那是因為scala可以推斷出直接嵌入到函數中的函數值的參數類型。
實際上scala還支持一種更地道的方式:在需要函數值的地方可以傳入普通函數。所以如下的代碼也是可以的:
def calculate(input: Int) = { println("calc with " + input) input } val equipment1 = new Equipment(calculate) val equipment2 = new Equipment(calculate)
這樣看起來更自然些,是不是。
就這樣。
##########