Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
lua创建一个表以添加到表中,给我';指数为零';错误_Lua - Fatal编程技术网

lua创建一个表以添加到表中,给我';指数为零';错误

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

下面是完整的代码。我试图将一个屏幕添加到一个屏幕表中,名称作为键,但在那一行(如下所述),我得到了错误“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
      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内部不使用任何形式的“自我”。