Golang, Lua, C#閉包變數捕獲差異
阿新 • • 發佈:2018-12-27
看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捕獲方式是值捕獲, 因此比較容易理解, 是多少就是多少