V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
justfly
V2EX  ›  Swift

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

  •  
  •   justfly · 2015-03-31 15:41:33 +08:00 · 5025 次点击
    这是一个创建于 3307 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    附上wikipedia闭包的解释

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

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

    各位咋看?

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

    文档给的例子 : 一个sort函数,接收一个数组参数和一个函数参数,函数是`(Int, Int) -> bool`类,sort用它来判断哪个大,它没有用任何的外层自由变量,所以我认为这就不是闭包。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   941 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:08 · PVG 04:08 · LAX 13:08 · JFK 16:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.