2009-02-06 3 views
4

как вы делаете таблицу по умолчанию, а затем используете ее при создании других таблиц?lua table constructor

пример

--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 получит у, ш, ч и текстуры, установленная по умолчанию значения, но ничего установить в скобках перезаписаны

+0

вы не можете сделать это, вы должны увеличить таблицу Кнопка с оператором «точка» .. Button.x =

ответ

4

Вы можете добиться того, что вы хотите путем слияния ответ Дуга с оригинальным сценарием, как это: (. Я на самом деле испытал это, он работает)

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 
} 

Edit: Вы можете сделать это немного симпатичнее и многоразовые, как это:

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 
} 

... 
0

Если вы установили метатаблицу новой таблицы-х __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.

+0

Скобки вокруг __index являются излишними. –

+0

Спасибо, Дэвид; Я скопировал неправильный текст из своей оболочки. Исправлена. –