lua表构造函数

时间:2009-02-06 00:01:26

标签: lua

如何创建默认表,然后在制作其他表时使用它?

例如

--default table
Button = {
 x = 0,
 y = 0,
 w = 10,
 h = 10,
 Texture = "buttonimg.png",
 onClick = function() end
}

newbutton = Button {
 onClick = function()
  print("button 1 pressed")
 end
}


newbutton2 = Button {
 x = 12,
 onClick = function()
  print("button 2 pressed")
 end
}

newbuttons会将y,w,h和纹理设置为默认值,但括号中设置的任何内容都会被覆盖

2 个答案:

答案 0 :(得分:4)

通过将Doug的答案与原始场景合并,您可以达到您想要的效果,如下所示:

Button = {
   x = 0,
   y = 0,
   w = 10,
   h = 10,
   Texture = "buttonimg.png",
   onClick = function() end
}
setmetatable(Button,
         { __call = function(self, init)
                       return setmetatable(init or {}, { __index = Button })
                    end })

newbutton = Button {
   onClick = function()
                print("button 1 pressed")
             end
}

newbutton2 = Button {
   x = 12,
   onClick = function()
                print("button 2 pressed")
             end
}

(我实际测试了它,它有效。)

修改:你可以让它更漂亮,可重复使用:

function prototype(class)
   return setmetatable(class, 
             { __call = function(self, init)
                           return setmetatable(init or {},
                                               { __index = class })
                        end })
end

Button = prototype {
   x = 0,
   y = 0,
   w = 10,
   h = 10,
   Texture = "buttonimg.png",
   onClick = function() end
}

...

答案 1 :(得分:0)

如果您将新表的metatable的__index设置为指向Button,它将使用Button表中的默认值。

--default table
Button = {
 x = 0,
 y = 0,
 w = 10,
 h = 10,
 Texture = "buttonimg.png",
 onClick = function() end
}

function newButton () return setmetatable({},{__index=Button}) end

现在,当您使用newButton()创建按钮时,他们会使用Button表中的默认值。

此技术可用于类或原型面向对象编程。有很多例子here