[求助]Lua闭包,貌似陷阱。
lua吧
全部回复
仅看楼主
level 5
jobjob 楼主
local s1 = {s2={s3={[5]={status='hit'}}}}
local idx = 5
function s1:f1()
return function()
--self.s2.s3[5] = nil
table.remove(self.s2.s3, idx)
print(self.s2.s3[idx], self.s2.s3[idx].status)
end
end
s1:f1()()
s1.s2.s3[idx].status = 'new_hit'
print(s1.s2.s3[idx].status)
这个事例,本来是期望在s1:f1()()里删除掉s1.s2.s3[idx]这个元素的。
换句话说执行print(self.s2.s3[idx], self.s2.s3[idx].status)的时候会报nil引用status的错误,以及设置new_hit和最后一行打印时也会nil错误。
可是事实上执行后打印的结果是:
table hit
new_hit
写这份逻辑时有理解过闭包的概念,个人觉得跟C#或C++语言的lamuda相仿。
请问大家如何避免此类陷阱?
2014年03月11日 01点03分 1
level 5
jobjob 楼主
大家请看这里,上面的事例代码排版乱了,我还是用截图方式好了。
2014年03月11日 01点03分 2
level 8
其实这个和闭包没有关系。
实际上你的remove是失败的,remove只能用于数组或列表。
2014年03月11日 04点03分 3
啊,谢谢回复,确实一直把那个5当成了索引~~ :D
2014年03月11日 06点03分
level 11
容我小声说一句,你这根本不是闭包
2014年03月12日 01点03分 5
惭愧~,以为self是upvalue~ 0_0
2014年03月12日 01点03分
level 5
jobjob 楼主
问题解决了哈,之前没搞清楚table里的索引和键。 [狂汗]
2014年03月12日 01点03分 6
1