lua创建一张表并往表中添加一张表导致出现“index为nil”的错误

以下是完整代码。我试图往一个名为screens的表中添加一个名字为键的屏幕表,但是在那行代码(下面有注释)中,我得到了“index为nil”的错误,我不确定原因。我只是在给定'name'键的情况下将一个元素添加到屏幕表中。

元素={} 

function 元素:元素(name,tags)
  local 对象={} 

  对象.name =name 
  对象.tags =tags 

  for k,v in pairs(元素) do 
    对象[k]=v 
  end 

  return 对象 
end

function 元素:getName()
  return self.name 
end

function 元素:onClick(callback)
  self.clickCallback=callback 
  return self 
end

function 元素:click()
  self.clickCallback() 
end

--=======================================

屏幕={} 

function 屏幕:屏幕(name)
  local 对象={} 

  对象.name =name 
  对象.elements ={} 

  for k,v in pairs(屏幕) do 
    对象[k]=v 
  end 
  print("creating screen") 
  return 对象 
end

function 屏幕:addElement(e)
  self.elements[e:getName()]=e 
end

function 屏幕:update()
  -- for testing
  self.elements["profile1"]:click() 
end

--=======================================

ui={} 
ui.screens ={} 

function ui:screen(name)
  if ui.screens[name]==nil then 
    ui.screens[name]=屏幕:屏幕(name)    --<----这里错误:索引为空
  end 

  return ui.screens[name] 
end

function ui:element(name,tags)
  return 元素:元素(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()
点赞
用户3636255
用户3636255

你使用 " 方法语法"(使用 :)定义的函数仅仅是将一个接收 self 对象作为隐藏第一个参数的函数的语法糖。

正如 Lua 参考手册 所描述的:

函数调用

functioncall ::= prefixexp ‘:’ Name args 可用于调用 "方法"。调用格式 v:name(args) 是 v.name(v,args) 的语法糖,但 v 只被计算一次。

因此,每次调用这些方法,您都必须传递一个 self 参数。这可以这样简单地完成:object:method(argument1, argument2)

(请注意,由于这仅仅是语法糖,您也可以像这样直接传递 self:object.method(object, argument1, argument2)

您出现错误是因为您使用了普通的 . 语法并没有提供一个 self 参数。相反,您传递的第一个参数:"profiles" 被赋值给 self,这就是为什么 name 变量是 nil 的原因。

2016-05-25 21:40:32