Scala两类函数字面量调用行为差异原因咨询
为什么第一个Scala函数字面量首次调用不直接返回求和结果?
这是个非常典型的Scala函数字面量语法误区,咱们把两个函数的类型和逻辑拆解开就一目了然了:
先看第一个函数 x
val x = (x:Int, y:Int) => (_:Int) + (_:Int)
这里的关键是箭头右侧的(_:Int) + (_:Int)本身就是一个独立的函数字面量,它的类型是(Int, Int) => Int——也就是一个需要接收两个Int参数才会执行加法的函数。
所以整个x的类型其实是(Int, Int) => (Int, Int) => Int:
- 当你调用
x(2,3)时,只是把2和3传给了x的两个参数,但x的函数体根本没使用这两个参数,而是直接返回了那个等待输入的加法函数(也就是你看到的res0)。 - 只有当你调用
res0(2,3)时,才是给那个返回的加法函数传入参数,最终得到求和结果。
简单说,x是一个“返回函数的函数”,而不是直接做加法的函数。
再看第二个函数 y
val y = (_:Int) + (_:Int)
这个函数字面量的类型就是(Int, Int) => Int:
- 两个下划线分别代表这个函数的第一个和第二个Int参数,当你调用
y(2,3)时,2会替换第一个下划线,3替换第二个下划线,直接执行加法运算,所以立刻返回5。
如何让第一个函数首次调用就返回结果?
如果想让x在调用x(2,3)时直接返回和,只需要把函数体改成使用传入的参数做加法即可:
val x = (x:Int, y:Int) => x + y
此时x的类型就是(Int, Int) => Int,和y的逻辑一致,调用x(2,3)就会直接返回5。
内容的提问来源于stack exchange,提问作者user3103957
相关产品推荐
相关产品推荐

