我们在用scala定义函数时,一般参数都是各种类型的值,这是常见的值调用
但偶尔也有需要把代码块作为参数传入的情况(名调用)
匿名函数经常可以作为函数的参数传入,非匿名函数也行(函数作为返回值返回就更常见了),下面是演示
object Lambda {
def main(args: Array[String]): Unit = {
// 传名参数
// 这里表示a的参数类型为一个返回值为Int类型的代码块
def f1(a: => Int): Unit = {
println("result: " + a)
println("result: " + a)
}
def f2(a: Int)(b: Int): Int = a + b
f1(f2(2)(3))
}
}
直接将一个Int类型的数字作为代码块传入当然也是可以的,但注意上面作为参数传入f1的不是f2(2)(3)的int类型结果,而是传入了完整的代码块
看看下面的代码就好理解了
object Lambda {
def main(args: Array[String]): Unit = {
// 传名参数
// 这里表示a的参数类型为一个返回值为Int类型的代码块
def f1(a: => Int): Unit = {
println("result: " + a)
}
def f2(): Int = {
println("这一个代码块")
23
}
//如果传入的不是代码块只是一个int类型的返回值,则不会打印f2中的字符串
f1(f2())
}
}
为什么把这么简单的东西叫做抽象控制呢?因为这里f2的执行已经被f1给控制了,a在f1中出现多少次,f2就会被调用多少次,执行的时机也被f1控制了
等同于将f2调用的控制权限抽象出来,交给了f1中的a,这就是控制抽象