函数值对消除代码重复有很大的帮助。但是像函数值这样直接将一个函数作为另一个函数的参数却不太利于函数值本身的重用。
来看一个例子:
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)
这样看起来更自然些,是不是。
就这样。
##########