Добавлен
Столкнулся с такой проблемой, как ООП в Lua. Никаких статей по этому поводу не нашёл, пока что их очень мало на сайте. На Хайве попытался найти наработки на Луа, но не нашёл реализацию систем через классы (таблицы). Подскажите, где можно достать какой-нибудь Lua-скрипт в Варкрафте с реализацией класса, или может быть зарубежная статья по этому поводу? Очень непривычно работать с этими таблицами как классами и пока непонятно, как лучше оформлять код, неизвестны многие нюансы. Как говорил кто-то, у Lua своя парадигма программирования — в чём её суть и действительно ли удобна она?
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
2
26
4 года назад
2
луа не ооп, не нужно страдать в нем этим
0
28
4 года назад
Отредактирован PT153
0
Принятый ответ
0
15
4 года назад
0
Hate:
луа не ооп, не нужно страдать в нем этим
Тогда какой самый адекватный способ реализации чего-то близкого к ООП? Не к Джассу же возвращаться.
0
23
4 года назад
0
реализация простой класс с наследование есть в луа примеры
0
15
4 года назад
0
PT153:
Никаких статей по этому поводу не нашёл
Плохо искали.
Хоть убейте, не нашёл. Как мне, к примеру, реализовать внутри метода "класса" цикл foreach, который пробегает по всем созданным объектам данного "класса"?
0
24
4 года назад
Отредактирован prog
0
Хоть убейте, не нашёл. Как мне, к примеру, реализовать внутри метода "класса" цикл foreach, который пробегает по всем созданным объектам данного "класса"?
Хранить список созданных экземпляров где-нибудь, например в метатаблице, чтобы был простой доступ к этому списку. Создание экземпляров реализовать через метод-фабрику, который инициализирует экземпляр и назначает ему метатаблицу.
Для большего удобства - список экземпляров можно либо записывать в каждый экземпляр при его создании либо положить в индексную таблицу в метатаблице, чтобы до этого списка было еще проще добраться из экземпляров.
0
15
4 года назад
Отредактирован JackFastGame
0
prog:
Хоть убейте, не нашёл. Как мне, к примеру, реализовать внутри метода "класса" цикл foreach, который пробегает по всем созданным объектам данного "класса"?
Хранить список созданных экземпляров где-нибудь, например в метатаблице, чтобы был простой доступ к этому списку. Создание экземпляров реализовать через метод-фабрику, который инициализирует экземпляр и назначает ему метатаблицу.
Для большего удобства - список экземпляров можно либо записывать в каждый экземпляр при его создании либо положить в индексную таблицу в метатаблице, чтобы до этого списка было еще проще добраться из экземпляров.
Почему-то в цикле он пробегает только по последнему созданному объекту, причём сколько всего объектов, столько раз по нему и проходит.
Реализовывал и через pairs, и через for i = 1, #list.
Для добавления в список я использую table.insert(list, object).
Что я делаю не так?

Вот фрагмент кода. В main loop выводит урон последнего созданного объекта.
Skillshot = {}
list = {}

function Skillshot:Create (damage)
    local obj = {}
    
    setmetatable(obj, self)
    self.__index = self
	table.insert(list, obj)
    
    self.damage = damage

    return obj
end

function Skillshot.Update ()

    --Main loop
    for i = 1, #list do 
        local obj = list[i]

        Debug("i = " .. i .. " " .. list[i].damage)
    end
end

do
    local InitGlobalsOrigin = InitGlobals
    function InitGlobals()
    InitGlobalsOrigin()

        function test()
            local dmg = 5
            TimerStart(CreateTimer(), 2.0, true, function ()
                dmg = dmg + 5
                local skillshot = Skillshot:Create(dmg)
            end)
        end
        test()
    end
end
2
28
4 года назад
2
который пробегает по всем созданным объектам данного "класса"
А какой ООП язык это вообще позволяет без создания массива объектов этого класса?

function Skillshot:Create (damage)
    local obj = {}
    
    setmetatable(obj, self)
    self.__index = self
	table.insert(list, obj)
    
    self.damage = damage

    return obj
end
Я не спец, но разве не у obj нужно ставить переменную damage?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.