Scala从零开始:函数参数的传名调用(call-by-name)和传值调用(call-by-value)

Scala中函数参数传递有两种方式:传值调用(call-by-value)和传名调用(call-by-name)。传值调用在函数调用时计算参数值,而传名调用在函数内部计算。传名调用可能导致多次计算,适用于无副作用的情况。传值调用效率较高,避免重复计算。通过酒鬼喝酒的例子,展示了两者区别及其应用场景。
摘要由CSDN通过智能技术生成

引言

Scala的解释器在解析函数参数(function arguments)时有两种方式:先计算参数表达式的值(reduce the arguments),再应用到函数内部;或者是将未计算的参数表达式直接应用到函数内部。前者叫做传值调用(call-by-value),后者叫做传名调用(call-by-name)。

package com.doggie

object Add {
  def addByName(a: Int, b: => Int) = a + b 
  def addByValue(a: Int, b: Int) = a + b 
}


addByName是传名调用,addByValue是传值调用。语法上可以看出,使用传名调用时,在参数名称和参数类型中间有一个=》符号。

以a为2,b为2 + 2为例,他们在Scala解释器进行参数规约(reduction)时的顺序分别是这样的:

 

  addByName(2, 2 + 2)
->2 + (2 + 2)
->2 + 4
->6

  addByValue(2, 2 + 2)
->addByValue(2, 4)
->2 + 4
->6


可以看出,在进入函数内部前,传值调用方式就已经将参数表达式的值计算完毕,而传名调用是在函数内部进行参数表达式的值计算的。

这就造成了一种现象,每次使用传名调用时,解释器都会计算一次表达式的值。对于有副作用(side-e

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值