Добавлен
Столкнулся с такой проблемой, как ООП в Lua. Никаких статей по этому поводу не нашёл, пока что их очень мало на сайте. На Хайве попытался найти наработки на Луа, но не нашёл реализацию систем через классы (таблицы). Подскажите, где можно достать какой-нибудь Lua-скрипт в Варкрафте с реализацией класса, или может быть зарубежная статья по этому поводу? Очень непривычно работать с этими таблицами как классами и пока непонятно, как лучше оформлять код, неизвестны многие нюансы. Как говорил кто-то, у Lua своя парадигма программирования — в чём её суть и действительно ли удобна она?
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
15
4 года назад
0
Почему self = nil можно не делать, ведь удаляя объект из списка (таблицы) экземпляров, мы удаляем не сам объект, а ссылку на него из этого списка, разве нет?
Этого будет достаточно?
function Skillshot:Create (...)
    local this = {}
    
    table.insert(skillshotObjectList, this)

	...
end
function Skillshot:Destroy ()
    table.remove(skillshotObjectList, TableFindElement(skillshotObjectList, self))
end
2
28
4 года назад
Отредактирован PT153
2
Почему self = nil можно не делать
Потому что это аргумент функции, локальная переменная, она уничтожится после выхода из функции.
Двоеточние это синтаксический сахар, который в определение метода добавляет аргумент self на первое место, а при вызове метода через : передаёт объект, что стоит до двоеточия, в аргумент self.
3
29
4 года назад
Отредактирован Doc
3
Не понимать работу базовых вещей и браться за костыли в виде ООП в луа - классика жанра. Делать так не советую. Каких-то особых удобств ООП в луа не дает. Приватные переменные вы не сделаете, полиморфизм в языке и так по дефолту из-за динамической типизации. Разве что наследование, которое даже практиканты ООП уже не советуют, потому что есть композиция.
0
23
4 года назад
0
какие вы фигни расказываете.

--
-- Реализация класса с наследованием
--

function Class(parent)
	local class = {}
	local mClass = {}

	-- Сам класс будет метатаблицей для объектов.
	-- Это позволит дописывать ему метаметоды.
	class.__index = class

	-- Поля объектов будут искаться по цепочке __index,
	-- и дотянутся, в том числе, до родительского класса.
	mClass.__index = parent

	-- Резервируем поле Super под родителя.
	class.Super    = parent


	-- Функция, которая будет вызываться при вызове класса
	function mClass:__call(...)
		local instance = setmetatable({}, class)

		-- Резервируем поле класса "init"
		if type(class.init) == 'function' then
			-- Возвращаем экземпляр и всё что он вернул функцией init
			return instance, instance:init(...)
		end

		-- Но если её нет - тоже ничего.
		return instance
	end

	return setmetatable(class, mClass)
end

-- Основной класс.
Shape = Class()

function Shape:init(x, y)
	-- в качестве self мы сюда передаём инстанс объекта.
	self.x = x or 0
	self.y = y or 0

	return '!!!'
end

function Shape:posArea()
	return self.x * self.y
end

-- Так как таблица Shape является метатаблицей для рождаемых ей объектов,
-- мы можем дописывать ей метаметоды.
function Shape:__tostring()
	return '[' .. self.x .. ', ' .. self.y ..']'
end

local foo, value = Shape(10, 20)

print('foo, value', foo, value) --> [10, 20] !!!

-- Наследник
Rectangle = Class(Shape)

function Rectangle:init(x, y, w, h)
	-- В данный момент, self - это пустая таблица,
	-- к которой прицеплена таблица Rectangle, как мета.

	-- Вызов родительских методов через Super.
	self.Super.init(self, x, y)
	-- Вызов собственных методов при инициализации - тоже возможен.
	self.w, self.h = self:getDefault(w, h)
end

function Rectangle:area()
	return self.w * self.h
end

function Rectangle:getDefault(w, h)
	return w or 10, h or 20
end

function Rectangle:__tostring()
	return '['..self.x..', '..self.y..', '..self.w .. ', '..self.h..']'
end

rect = Rectangle(10, 20, 30, 40)

print('rect',           rect)           --> [10, 20, 30, 40]

print('rect:area()'   , rect:area())    --> 30 * 40 = 1200

-- Вызов родительского метода
print('rect:posArea()', rect:posArea()) --> 10 * 20 = 200
0
16
4 года назад
0
Doc:
Каких-то особых удобств ООП в луа не дает.
Дает, оборачивание дамми, снарядов, контейнеров и прочие вещи в объекты позволяет быстро и удобно плодить их в процессе разработки, делая универсальными, видя что может предоставить тебе класс. ООП незаменимая вещь где бы она ни была. Просто в варкрафте её должно быть по-меньше, но оно имеет место быть. Делать всё через функциональщину мерзко и неудобно.
>Приватные переменные вы не сделаете
Это возможно если использовать способ ООП, который описывал я
3
29
4 года назад
3
ООП незаменимая вещь где бы она ни была. Просто в варкрафте её должно быть по-меньше, но оно имеет место быть.
Красивое мнение, жаль, что неправильное.
позволяет быстро и удобно плодить их в процессе разработки, делая универсальными
А как это с ООП то связано конкретно?
Делать всё через функциональщину мерзко и неудобно
У меня почему-то большие сомнения, что Вы знаете, что такое функциональщина.
Это возможно если использовать способ ООП, который описывал я
Для этого придется все функции писать в теле конструктора и они будут копироваться на каждый объект, создавая рантайм оверхед.

В дополнение этого объекты созданные таким образом невозможно перезагрузить в рантайме, если подобная функция используется.
0
18
4 года назад
0
prog:
... практически в любом языке один из самых быстрых способов ...
A можно где почитать список быстрых и хороших решений для разных структур данных?
0
28
4 года назад
0
0
18
4 года назад
0
Спасибо за ответ, PT153. Но более не стоит советовать эту книгу)
0
28
4 года назад
0
Vlod, а что с ней не так? Нормальная книга.
0
18
4 года назад
Отредактирован Vlod
0
PT153
PT153, перечислять все нюансы действительно долго. Начать можно с начала книги, кое представляет собой две сортировки. Пояснениям вводных обозначений удосуживаются только О(n) и псевдокод. Обобщающие выкладки каждой отдельной темы разбросаны по всему параграфу, вместо того, чтобы быть собранными в одном месте. Выводам по тем же сортировкам уделяется, чуть ли не одна страница в конце с единственной таблицей. В книге действительно есть годные технические подробности древнеисторических методов. 88% всей книги - обыденный университетский курс. Понимание того, о чем пишется, приходило лишь благодаря тому, что это я уже знал. Страшно представить, как такое можно понять с нуля, опираясь на данный туториал. Читать книгу местами было невыносимо скучно. Не в обиду авторам, но подача материала ужасная. И сам материал настолько старый (книга 2013г), что в нем отсутствуют все современные решения. Но это субъективное мнение, которое опирается на опыт работы с определенными методическими материалами. Возможно, где-то преподавание настолько плохое, что подачу данного материала можно назвать качественной. Честно, не хочется писать такое про труд людей, но просто это ***
0
28
4 года назад
0
Vlod, есть издания поновее, у меня было только такое, так как книгу покупать вообще-то нужно)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.