Scala的传值调用与传名调用理解

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

}

总结:函数可以作为一个方法的参数进行传递。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醪糟小丸子

小小帮助,不足挂齿

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值