Объекты класса Lua?

Я новичок в Lua, и мне интересно, есть ли способ создать множество объектов класса для создания разных элементов в моем случае, как в языке ООП, таком как C # или Java. Пример того, что я говорю, - это такой класс в Lua ...

weapon = {}

function weapon.load()
{
    weapon.name = "CHASE'S BUG"
    weapon.damage = 1
    weapon.rare = "Diet Valley Cheez"
    weapon.hottexture = love.graphics.newImage("/ledata/invalid.png")
    weapong.playtexture = love.graphics.newImage("/ledata/invalid.png")
    weapon.dura = 1
    weapon.type = "swing"
}

Но в основном классе вы можете создавать новые объекты этого класса, что было бы сделано так, например, на C #.

weapon Dagger = new weapon();
Dagger.name = "Dagger of Some Mountain"
...

Есть ли способ сделать это в Lua?


person freemann098    schedule 23.08.2013    source источник


Ответы (4)


Lua объектно-ориентирован, но это не похоже на Java / C ++ / C # / Ruby и т. Д., Здесь нет собственного класса, единственный способ создать новый объект - это клонировать существующий объект. Вот почему он называется языком прототипов (например, JavaScript).

Прочтите Программирование на Lua, глава 16. Вы можете издеваться над обычным ООП, используя метатаблицу.

person Yu Hao    schedule 23.08.2013
comment
@ freemann098 Да, вы можете, Lua предоставляет инструмент для создания инструментов, но вам нужно немного поработать. Прочтите книгу, это книга, которую должен прочитать каждый программист Lua. - person Yu Hao; 23.08.2013
comment
Я бы также предложил MiddleClass: это библиотека, реализующая объектную ориентацию для Lua. - person Giovanni Cappellotto; 23.08.2013

Другой способ сделать это - использовать такую ​​таблицу (на примере автомобиля):

    Car = {}
    Car.new = function(miles,gas,health)
        local self = {}

        self.miles = miles or 0
        self.gas = gas or 0
        self.health = health or 100

        self.repair = function(amt)
            self.health = self.health + amt
            if self.health > 100 then self.health = 100 end
        end

        self.damage = function(amt)
            self.health = self.health - amt
            if self.health < 0 then self.health = 0 end
        end

        return self
    end

Он создает таблицу с именем «Car», которая будет эквивалентом класса, а не экземпляра, затем он определяет метод «новый» в классе Car, который возвращает экземпляр автомобиля с переменными и функциями. Пример использования этой реализации:

    local myCar = Car.new()
    print(myCar.health)
    myCar.damage(148)
    print(myCar.health)
    myCar.repair(42)
    print(myCar.health)
person user2780643    schedule 15.09.2013

Есть много способов. Это простой. Не очень много ООП, у вас нет наследования и прочего. Но я думаю, что в вашем случае это сработает.

function weaponFire ()
    print "BANG BANG"
end

function newWeapon (opts)
    local weaponInstance = {}

    weaponInstance.name = opts.name
    weaponInstance.damage = opts.damage

    weapon.fire = weaponFire

    return weaponInstance
end
person Huy Le    schedule 23.08.2013

поскольку вы отметили love2d, вы можете взглянуть на средний класс. Там есть документы. И еще у него есть надстройка вроде с отслеживанием состояния, которая предназначена в основном для игр и love2d.

person xpol    schedule 25.08.2013