lua创建一个表格添加到一个表格,给我'索引是零'错误

时间:2016-05-25 20:42:58

标签: 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()

1 个答案:

答案 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的原因。