swift 把作为函数参数的匿名函数叫做闭包(closure)?

2015-03-31 15:41:33 +08:00
 justfly

看了下swift的文档关于闭包的这一节

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html

看到本页文档前大半部分讲的其实是匿名函数作参数,这根本不是我一直理解的闭包啊。不明白为什么会把lambda这样的概念称作闭包,让人很容易混淆。

附上wikipedia闭包的解释

闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。

闭包一词经常和匿名函数混淆。这可能是因为两者经常同时使用,但是它们是不同的概念。

各位咋看?

5237 次点击
所在节点    Swift
7 条回复
yuankui
2015-03-31 15:52:31 +08:00
我的理解
闭包=匿名函数+scope
tabris17
2015-03-31 15:53:57 +08:00
带upval的匿名函数
justfly
2015-03-31 16:12:04 +08:00
我自己为啥觉得闭包和匿名函数一点关系也没有,就是俩独立的概念
luahou
2015-03-31 16:59:40 +08:00
应该是如一楼说的,关系到作用范围。
billlee
2015-03-31 17:03:55 +08:00
叫闭包的关键是它是 nested 的,能够引用外层的变量,当它被当作参数传递时,被引用的外层变量就是那个自由变量。
这和 javascript, python 里面是的 nested 函数是一样的,和 Java 里面的内部类也差不多,都是闭包的一种形式。
blacktulip
2015-03-31 17:05:48 +08:00
每次看到 closure 都会想起 banana, gorilla 和 jungle
justfly
2015-03-31 18:10:33 +08:00
@billlee 关键是 这里函数作为参数并没有用到任何的自由变量

文档给的例子 : 一个sort函数,接收一个数组参数和一个函数参数,函数是`(Int, Int) -> bool`类,sort用它来判断哪个大,它没有用任何的外层自由变量,所以我认为这就不是闭包。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/180588

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX