Lua 创建一个表以添加到表中,导致我'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()

您使用"方法语法"(带有 : '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的原因。

相关内容

最新更新