一个有关scala简单闭包的问题:
def add(more: Int) = (x: Int) => x + more
val a = add(1)
println(a(10))
不太明白1和10分别传给了谁?
我的理解是1传给了x,10传给more,不知道对不对
求大神详细解释一下。
一个有关scala简单闭包的问题:
def add(more: Int) = (x: Int) => x + more
val a = add(1)
println(a(10))
不太明白1和10分别传给了谁?
我的理解是1传给了x,10传给more,不知道对不对
求大神详细解释一下。
是1传给了more
,10传给了x
add
函数接受一个整数参数,并返回一个函数(x: Int) => x + 1
然后这个函数被赋给了a
,等价于def a(x: Int) = x + 1
最后给a
提供了参数10调用了一下,输出10 + 1
的运算结果。
// def add(more: Int) = (x: Int) => x + more
// 等价于
def add(more: Int) = new Function[Int, Int] {
def apply(x: Int) = x + more
}
val a = add(1)
// 等价于
// a = new Function[Int, Int] {
// def apply(x: Int) = x + 1
// }
a(10)
// 等价于
// a.apply(10)
// 也就是 10 + 1
第一句话意思是,
add
是一个函数,接收一个参数more
,返回一个函数add(1) 是一次函数调用。因此,1 是add的实参,对应more。
其实这就相当于把函数 add(more,x)这样的函数调用方式由
add(1,10)
变成了add(1)(10)
。在函数式编程里面可以认为所有函数只有一个参数
add(1,10)
这样的可以认为是(1,10)
是一个二元组(或者说C语言里的结构体),后一种就是函数正常的函数。那么多个参数的函数就是add(1)(10)
这样的。此时,如果只是a = add(1)
这样的话,就是add(1)
返回一个函数,当下次给定参数a(10)
的时候给出函数最终的调用结果。那么
a=add(1)
,这样调用的时候,必然有个地方保存参数1
(否则下次调用无法计算最终结果),也就是more
,more
是函数的局部变量,在函数外无法访问。而全局代码,a(10)
调用的时候可以访问到more
,这种现象叫做闭包。