我看过大多数csdn把c#和lua的闭包一概而谈,我在使用C#时,检测到C#的闭包和lua还是有些区别的。
C#的闭包来一个例子(unity中使用):
public class ClosuerContent : MonoBehaviour
{
delegate void Print();
void ClosuerTest()
{
Print[] arr = new Print[3];
for (int i = 0; i < 3; i++)
{
arr[i] = new Print(() => { Debug.Log(i); });
}
arr[0]();
arr[1]();
arr[2]();
}
void Start()
{
ClosuerTest();
}
}
输出结果3,3,3
再看lua:
local tbl = {}
for i = 1,3 do
tbl[i] = function() print(i) end
end
for i, func in ipairs(tbl) do
tbl[i]()
end
输出结果,1,2,3
为什么会有如此差异呢,看C#这行代码 for (int i = 0; i < 3; i++),i是在循环for循环之初声明的,所以闭包里实际都是循环体外部的i,而lua的for循环,i是在循环体内的,每次的i都是新的局部变量,故而匿名函数中的i是变化的。
如果想要C#实现lua的效果,ClosureTest应该改为
void ClosuerTest()
{
Print[] arr = new Print[3];
for (int i = 0; i < 3; i++)
{
int x = i;
arr[x] = new Print(() => { Debug.Log(x); });
}
arr[0]();
arr[1]();
arr[2]();
}