以下是整个代码。我试图将屏幕添加到屏幕表格中,并将名称作为键,但在该行上(如下所示)我得到错误' index is nil'而且我不确定为什么。我只是在屏幕表格中添加一个元素,其中包含给定的'名称'键。
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()
答案 0 :(得分:2)
使用“method syntax”(带:
)定义的函数只是将自身对象作为隐藏的第一个参数的函数的语法糖。
正如Lua reference manual所描述的那样:
表格
functioncall :: = prefixexp':'名称args可用于调用 “方法”。调用v:name(args)是v.name(v,args)的语法糖, 除了v只评估一次。
因此,每次调用这些方法时,您都必须传递自我参数。这可以很容易地完成:object:method(argument1, argument2)
。
(请注意,由于这只是语法糖,你也可以像这样直接传递自我:object.method(object, argument1, argument2)
)
由于使用了正常的.
语法而没有提供自我参数,因此您会收到错误。相反,您传递的第一个参数:“个人资料”被分配给自己,这就是name
变量为nil
的原因。