1. 程式人生 > >Golang, Lua, C#閉包變數捕獲差異

Golang, Lua, C#閉包變數捕獲差異

看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捕獲方式是值捕獲, 因此比較容易理解, 是多少就是多少