Поиск по сайту
Результаты поиска по тегам 'class'.
Найдено 1 результат
-
Предисловие Во многих языках программирования классы включены в стандартную реализацию. Однако Lua настолько минималистичен, что по умолчанию классов в нем нет. Но нам ничего не мешает реализовать классы используя стандартные возможности языка. В моей реализации классы реализованы через замыкания. Описание моей библиотеки Здесь особо описывать нечего, поэтому я просто приложил примеры кода( комментарии обязательны к прочтению! ) 1. Создание класса local Class = require("class") -- Класс для точки в 2д пространстве local Point2d = Class({ -- Конструктор класса __init__ = function(self, x, y) self.x, self.y = x, y end, -- Методы класса -- Примечание: -- аргументы каждого метода класса обязательно -- должны начинаться с "self" (ну, либо с "this" или "it", кому как угодно) printCoords = function(self) print("X = ".. self.x .."; Y = ".. self.y) end }) -- Создание экземпляра класса Point2d local p1 = Point2d(5, 11) -- Вызов метода p1.printCoords() -- Выведет "X = 5; Y = 11" local p2 = Point2d(p1.x * 2, p1.y * 2) p2.printCoords() -- Выведет "X = 10; Y = 22" 2. Ты ведь не забыл про наследования?! Я не очень люблю нагромождать свой код зависимостями, а потом постоянно ломать голову мыслями "А от чего у меня унаследован вот этот класс? От какого именно класса у меня унаследован этот метод? Почему одно наследование перекрывает другое? " Поэтому я реализовал возможность выборочно унаследовать необходимый метод у конкретного класса, так как такой способ наследования тупо проще, понятнее, и лишний раз не нагружает разум программиста адскими зависимостями между классами. Простой пример: local Class = require("class") -- Класс для точки в 2д пространстве local Point2d, Point2d_prototype = Class({ __init__ = function(self, x, y) self.x, self.y = x, y end, printCoords = function(self) print("X = ".. self.x .."; Y = ".. self.y) end }) local Player = Class({ __init__ = function(self, x, y, ...) self.x, self.y = x, y self.otherInfo = ... end, -- Унаследуем метод "printCoords" у класса Point2d -- Для этого обратимся к *прототипу* этого метода и получим наследуемый метод по имени printCoords = Point2d_prototype.printCoords }) -- Создание экземпляра класса Point2d local point = Point2d(5, 11) -- Вызов метода point.printCoords() -- Выведет "X = 5; Y = 11" local player = Player(4, 2, "RccHD") player.printCoords() -- Выведет "X = 4; Y = 2" Исходники библиотеки Библиотека получилась совсем небольшой, поэтому вы можете скопировать исходник прямо из этой статьи: Либо скачать с pastebin ( https://pastebin.com/WVxaHb4Y ) class.lua : local prepareObj prepareObj = function(root, obj, proto, mt) for k, v in pairs(proto) do local t = type(v) if t == "table" and k ~= "__proto__" and k ~= "__root__" then obj[k] = prepareObj(root, { __proto__ = v, __root__ = root }, v, mt) end end setmetatable(obj, mt) return obj end local classMt = { __index = function(self, key) local v = self.__proto__[key] if type(v) == "function" then return function(...) return v(self.__root__, ...) end else return v end end } return function(proto) proto.__new__ = function(...) local obj = { __proto__ = proto } obj.__root__ = prepareObj(obj, obj, proto, classMt) if proto.__init__ ~= nil then proto.__init__(obj.__root__, ...) end return obj end return proto.__new__, proto end Для того, чтобы начать использовать классы в своих программах нужно положить файл class.lua в папку рядом со своими программами (или в /usr/lib , но лучше не надо) После этого импортируйте библиотеку написав в своем коде вот это: local Class = require("class") И помните: важно не количество кода, а его качество!
