scala简单闭包问题

wxmimperio
  • 720

一个有关scala简单闭包的问题:

def add(more: Int) = (x: Int) => x + more
val a = add(1)
println(a(10))

不太明白1和10分别传给了谁?
我的理解是1传给了x,10传给more,不知道对不对
求大神详细解释一下。

回复
阅读 2.5k
3 个回答
✓ 已被采纳

第一句话意思是,add 是一个函数,接收一个参数more,返回一个函数

def add(more: Int) = ((x: Int) => x + 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(否则下次调用无法计算最终结果),也就是moremore是函数的局部变量,在函数外无法访问。而全局代码,a(10)调用的时候可以访问到more,这种现象叫做闭包。

是1传给了more,10传给了x

add函数接受一个整数参数,并返回一个函数(x: Int) => x + 1

然后这个函数被赋给了a,等价于def a(x: Int) = x + 1

最后给a提供了参数10调用了一下,输出10 + 1的运算结果。

zhenghu
  • 39
// 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
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏