通常 函数/方法 的参数是传值参数,也就是说,参数的值在传递给函数之前已经确定好了。而在Scala中,方法或函数的参数可以是一个表达式,也就是可以将一个代码逻辑传递给某个方法或着函数。(这有点像C语言)
分别有两种调用方式:
1.Scala的传值调用(call-by-value),参数是一个或多个类型的变量
2.Scala的传名调用(call-by-name),参数传的是函数/方法名,即函数/方法(一段逻辑)
二话不说,直接上一个代码(课程Demo)来说明:
object CallByNameAndValue { //钱包总金额 var money=100 //每次扣5元 def huaQian():Unit={ money=money-5 } //数数每次扣完剩多少钱 def shuQian():Int={ huaQian() //调用方法 money //返回值 } //方法printByValue的参数是一个Int类型的变量 def printByValue(x:Int)={ for (a<- 0 until 3) { //0,1,2 println(s"测试: ${x}元") } } //方法printByName的参数是一个无参,返回值为Int类型的函数(x: => Int 表示的是一个方法的签名) def printByName(x: => Int)={ for(b<- 0 to 3) { //0,1,2,3 println(s"每次都算算还剩: ${x}元")//该方法无返回值,直接在方法体输出结果 } } def main(args: Array[String]): Unit = { // 传值调用:传给方法的是一个确定的值 printByValue(shuQian()) //传入的是shuQian()计算后返回的一个确定值 // 传名调用:传的是一段逻辑 // 将shuQian方法名称传递到printByName方法的内部执行 printByName(shuQian()) } }
结果:
//传值调用 测试: 95元 测试: 95元 测试: 95元 //传名调用 每次都算算还剩: 95元 每次都算算还剩: 90元 每次都算算还剩: 85元 每次都算算还剩: 80元
再看一个:
object Calculate { //add方法有3个参数:第1个参数是拥有两个Int类型参数、返回值为Int的函数 //该方法的返回值为Int def add(f:(Int,Int)=>Int,a:Int,b:Int):Int={ f(a,b) //方法体功能是调用这个带参函数变量,传入方法参数变量 } //定义一个函数,有2个Int类型参数,且返回值为参数相乘结果 val fa:(Int,Int)=>Int=(a,b)=>a*b //add1方法有2个参数:第一个参数是拥有一个Int类型、返回值为Int的函数 //可以不写返回值类型,编译器可自动推测 def add1(c:Int =>Int,d:Int)={ c(d)*d //方法功能是调用函数变量,传入方法参数并与参数相乘 } //定义一个拥有1个参数的函数 // val c:Int=>Int=e=>e*5 val c=(e:Int)=>e*5 def main(args: Array[String]): Unit = { //调用add方法 val res1=add(fa,2,3) //f(2,3)-> 2*3=6 println(res1) //调用add1方法 val res2=add1(c,3) //c(3)*c -> 3*5*3=45 println(res2) } }
总结:函数可以作为一个方法的参数进行传递。