如何创建默认表,然后在制作其他表时使用它?
例如
--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和纹理设置为默认值,但括号中设置的任何内容都会被覆盖
答案 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。