• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
阿巴阿巴..
帮助1

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

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))
  }
}
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgabgkk
系列文章
更多 icon
同类精品
更多 icon
继续加载