下面是整个代码。我正在尝试将屏幕添加到屏幕表中,名称作为键,但在那行(如下所述)我收到错误"索引为零",我不确定为什么。我只是使用给定的"名称"键向屏幕表添加一个元素。
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()
您使用"方法语法"(带有 :
's)定义的函数只是将 self 对象作为隐藏的第一个参数的函数的语法糖。
正如Lua参考手册所描述的那样:
表格
函数调用 ::= 前缀exp ':' 名称参数可用于调用 "方法"。调用 v:name(args) 是 v.name(v,args) 的语法糖, 除了 V 只评估一次。
因此,每次调用这些方法时,您还必须传递一个自我参数。这可以很容易地完成,如下所示:object:method(argument1, argument2)
.
(注意,由于这只是句法糖,你也可以像这样直接传递self:object.method(object, argument1, argument2)
由于使用正常的.
语法并且不提供 self 参数,因此会出现错误。相反,您传递的第一个参数:"profiles"被分配给self,这就是为什么name
变量nil
的原因。