scala函数参数的传递:传值调用和传名调用

本文探讨了Scala中函数参数的两种传递方式——传值调用和传名调用。传值调用先计算参数值再应用,避免重复计算提高效率;传名调用则直接传递未计算的表达式,仅在需要时计算。通过实例分析,展示了两种调用方式的不同效果,帮助理解其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数参数的传递有两种:传值调用和传名调用
传值调用:先计算参数表达式的值,再应用到函数内部
传名调用:将未计算的参数表达式直接应用到函数内部

object Add{
def addByName(a: Int, b: =>Int) = a + b //传名调用
def addByValue(a: Int, b: Int)= a + b	//传值调用
}
addByName(2, 2 + 2)    
->2 + (2 + 2)
->2 + 4
->6
addByValue(2, 2 + 2)
->addByValue(2, 4)
->2 + 4
->6

传值调用与传名调用区别:

  • 传值调用避免了函数内部多次使用参数时重复计算其值,在一定程度上提高了效率
  • 传名调用的优势在于,如果参数在函数体内部没有被使用到,那么它就不用计算参数表达式的值

上边例子可能有些模糊,下面例子看懂了就会清晰很多。

object Test {var money = 10def drink: Unit ={money -= 1 }
def count: Int = {
					drink
					money }
def printByName(x: => Int): Unit = {for(i<-0 until 5)
println(x )
}
def printByValue(x: Int): Unit ={for(i<-0 until 5)
println( x )
}
def main(args:Array[String]) ={
printByName(count)
printByValue(count)
}}

代码实现后结果如下图:
在这里插入图片描述
前五次结果为传名调用的结果,每一次调用都会计算一次并且输出,而后五次的结果显然不同,传值调用直接算出了最终结果并且输出五次同样的结果。

下面还有一个例子,让我们更进一步了解他们的区别

import java.io.PrintWriter
object WhyAlwaysMe {
  var flag: Boolean = true
  def useOrNotUse(x: Int, y: =>Int) = {
    flag match{
      case true => x
      case false => x + y
    }
  }
  def main(args: Array[String]) =
  {
    println(useOrNotUse(1, 2))
    flag = false
    println(useOrNotUse(1, 2))
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值