swift 把作为函数参数的匿名函数叫做闭包(closure)? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
justfly
V2EX    Swift

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

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

    看了下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     Solana     2618 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 15:16 PVG 23:16 LAX 08:16 JFK 11:16
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86