конструктор таблицы lua - PullRequest
       7

конструктор таблицы lua

4 голосов
/ 06 февраля 2009

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

пример

--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
}

Для новых кнопок будут заданы значения по умолчанию для y, w, h и текстуры, но все, что установлено в скобках, будет перезаписано

Ответы [ 2 ]

4 голосов
/ 06 февраля 2009

Вы можете достичь желаемого, объединив ответ Дуга с вашим исходным сценарием, например так:

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
}

...
0 голосов
/ 06 февраля 2009

Если вы установите для __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.

Этот метод может использоваться для объектно-ориентированного программирования класса или прототипа. Есть много примеров здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...