Свой класс можно добавить так:
Код
class "my_cool_class"
Здесь "my_cool_class" - имя моего нового класса. Записывается в кавычках, т.е. это строка. Потом можно добавлять к этому классу свои методы:
Код
-- это специальный метод - конструктор. Будет вызван при создании класса.
function my_cool_class:__init(num)
self.my_param = num -- добавили в свой класс переменную
end
-- обычный метод
function my_cool_class:cool_method_of_my_class()
get_console():execute("lua_bind_in_action_"..self.my_param)
end
-- деструктор, вызывается при сборке объекта сборщиком мусора. Аргументов не имеет (кроме скрытого self. об этом см. далее)
function my_cool_class:__finalize()
get_console():execute("good_by_"..self.my_param)
end
Потом можно создавать экземпляры своего класса, вызывать их методы и пр.:
Код
local obj1 = my_cool_class(1) -- здесь создаётся новый объект. При этом вызывается конструктор и ему передаются аргументы этого вызова (в данном случае число 1).
local obj2 = my_cool_class(4)
obj1:cool_method_of_my_class()
obj2:cool_method_of_my_class()
Как только объект становится ненужным (т.е. на него больше нет ссылок) он удаляется сборщиком мусора. При этом вызывается его метод __finalize
При чём здесь self.
self - это скрытый первый аргумент. Конструкция вида:
Код
function class_name:fun_name(<список аргументов>)
end
на самом деле эквивалентна конструкции
Код
function class_name.fun_name(self, <список аргументов>)
end
Обратите внимание на двоеточие в первом случае и точку во втором.
При вызове метода конструкция вида:
object_name:fun_name(<список аргументов>)
эквивалентна конструкции
object_name.fun_name(object_name, <список аргументов>)
Это означает, что в качестве self как правило передаётся сам же объект. "Как правило" - это потому, что можно в принципе передать что-то другое. Но лучше этого соглашения не нарушать.
Всё это здорово, но какая от этого польза? Ну сделал я свой класс, и что с ним делать?
В общем, классы - это неплохое средство организации своего кода. Владеющие объектно-ориентированным подходом найдут это расширение весьма удобным. В частности такие, ни к чему не привязанные классы, в скриптах сталкера используются в некоторых местах. Однако, настоящая сила этой технологии не в этом. С помощью этой технологии можно расширять классы, экспортированные в Lua со стороны движка игры. Об этом пойдет речь в следующей части.