lua创建一个表以添加到表中,给我';指数为零';错误
下面是完整的代码。我试图将一个屏幕添加到一个屏幕表中,名称作为键,但在那一行(如下所述),我得到了错误“index is nil”,我不知道为什么。我只是用给定的“name”键向screens表添加一个元素lua创建一个表以添加到表中,给我';指数为零';错误,lua,Lua,下面是完整的代码。我试图将一个屏幕添加到一个屏幕表中,名称作为键,但在那一行(如下所述),我得到了错误“index is nil”,我不知道为什么。我只是用给定的“name”键向screens表添加一个元素 element = {} function element:element(name, tags) local obj = {} obj.name = name obj.tags = tags for k,v in pairs(element) do
element = {}
function element:element(name, tags)
local obj = {}
obj.name = name
obj.tags = tags
for k,v in pairs(element) do
obj[k] = v
end
return obj
end
function element:getName()
return self.name
end
function element:onClick(callback)
self.clickCallback = callback
return self
end
function element:click()
self.clickCallback()
end
--=======================================
screen = {}
function screen:screen(name)
local obj = {}
obj.name = name
obj.elements = {}
for k,v in pairs(screen) do
obj[k] = v
end
print("creating screen")
return obj
end
function screen:addElement(e)
self.elements[e:getName()] = e
end
function screen:update()
-- for testing
self.elements["profile1"]:click()
end
--=======================================
ui = {}
ui.screens = {}
function ui:screen(name)
if ui.screens[name] == nil then
ui.screens[name] = screen:screen(name) --<---- ERROR: index is nil
end
return ui.screens[name]
end
function ui:element(name, tags)
return element:element(name, tags)
end
--local e = ui.element("profile1", "profile_button btnProfile1")
ui.screen("profiles"):addElement(
ui.element("profile1", "profile_button btnProfile1")
:onClick(function() print("Profile1 button clicked")
end)
)
ui.screen("profiles"):update()
element={}
功能元素:元素(名称、标记)
局部obj={}
obj.name=名称
obj.tags=标记
对于k,v成对(元素)do
obj[k]=v
结束
返回obj
结束
函数元素:getName()
返回self.name
结束
函数元素:onClick(回调)
self.clickCallback=回调
回归自我
结束
功能元素:单击()
self.clickCallback()
结束
--=======================================
屏幕={}
功能屏幕:屏幕(名称)
局部obj={}
obj.name=名称
obj.elements={}
对于k,v成对(屏幕)do
obj[k]=v
结束
打印(“创建屏幕”)
返回obj
结束
功能屏幕:添加元素(e)
self.elements[e:getName()]=e
结束
功能屏幕:更新()
--用于测试
self.elements[“profile1]:单击()
结束
--=======================================
ui={}
ui.screens={}
功能界面:屏幕(名称)
如果ui.screens[name]==nil,则
ui.screens[name]=screen:screen(name)-使用“”(with:
)定义的函数只是将自对象作为隐藏的第一个参数的函数的语法糖
正如报告所描述的:
形式
functioncall::=prefixexp':'可以使用名称参数调用
“方法”。调用v:name(args)是v.name(v,args)的语法糖,
除了v只计算一次
因此,每次调用这些方法时,也必须传递一个自参数。这样做很容易:object:method(argument1,argument2)
(注意,因为这只是语法上的糖分,所以您也可以像这样直接传递self:object.method(object,argument1,argument2)
)
由于使用了正常的
语法,并且没有提供自参数,因此会出现错误。相反,您传递的第一个参数:“profiles”被分配给self,这就是为什么name
变量是nil
ui:screen(“profiles”):update()
那么这是一个问题,因为我用:方式而不是另一种方式定义函数(ui.screen=function()end)我之所以需要这样做,是因为ui内部不使用任何形式的“自我”。