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