先看一个例子
def get(x:Int):Int={
println(s"$x")
x
}
def getByValue(y:Int):Int={
x+x
}
def getByName(y: =>Int):Int={
x+x
}
getByValue(get(1))
getByName(get(2))
(1)get方法
该方法传入x,先打印x,然后将x作为返回值。
(2)getByValue和getByName
这两个方法定义非常相似,参数写法不同,getByName参数类型是=>Int。而GetByValue的参数类型是Int。
它们有什么区别呢?
getByValue(get(1))中通过get(1)方法将值传递给了y,即y=get(1),此时调用get(1)方法,所以输出1,
getByName(get(2))中通过get(2)方法将get(1)的地址给了y,每次需要x都要根据这个地址取找具体的值,getByName方法中有两次使用x,每一次都要根据地址来找x,所以输出两次2.
输出结果:
1
2
2
call by value和call by name的不同之处,可以如下示意理解:
call by value在用到y的时候,直接把x的值给了y,之后它俩再无关系;
call by name在用到y的时候,是把x的地址给了y,值并没有给他,每次用y的时候,先由地址找到x的值。
很类似C语言的函数参数的值传递和地址传递,不过上面的示意图只是帮助大家理解。
举个生活中的例子,比如做包子需要面粉,call by value是把面粉直接买回来,做包子的时候直接用就可以,而call by name是把面粉店的地址记下来,每次做包子的时候,先根据面粉店的地址找到面粉店,然后从面粉店把面粉买回来,才做包子。