通常 函数/方法 的参数是传值参数,也就是说,参数的值在传递给函数之前已经确定好了。而在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)
}
}