IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Golang, Lua, C#闭包变量捕获差异

    战魂小筑发表于 2015-09-23 10:31:00
    love 0

    看C#例子

                Action[] a = new Action[3];
     
                for (int i = 0; i < 3; i++)
                {
                    a[i] = ( ) => { Console.WriteLine(i); };
                }
     
                for (int i = 0; i < 3; i++){
                    a[i]();
                }

    C#打印结果为3 3 3

     

    Golang的例子

        a := make([]func(), 3 )
        
        for i := 0; i < 3; i++ {
            
            a[i]= func( ){
                
                fmt.Println(i)
                
            }    
        
        }
        
        for _, s := range a {
            s()
        }

    Golang打印结果为3 3 3

     

    最后是Lua的例子

    a = {}
     
    for i = 1, 3 do
     
        table.insert( a, function()
            print(i)
        end
        )
     
    end
     
     
    for _, v in ipairs(a) do
        v()
    end

    Lua打印结果为1 2 3

     

    差异在于, C#和Golang将变量捕获到闭包内时, 均使用引用方式, 即当最后开始调用使用变量时, 由于变量已经结束循环, 所以是最终值

    但是Lua捕获方式是值捕获, 因此比较容易理解, 是多少就是多少



    战魂小筑 2015-09-23 18:31 发表评论


沪ICP备19023445号-2号
友情链接