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
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相仿。
请问大家如何避免此类陷阱?
