NEO 541 Опубликовано: 27 марта, 2016 Предисловие Для начала мы разберёмся зачем библиотека? Библиоте́ка (от англ. library) в программировании — сборник подпрограмм или объектов, используемых для разработки программного обеспечения (ПО). Перед тем как писать свою библиотеку определитесь в её необходимости, но перед этим используйте поиск по форуму, возможно библиотека реализующая нужные алгоритмы уже существует. Если такой библиотеки вы не нашли и определились в её необходимости - тогда приступайте к её реализации. Создание библиотеки Для правильного создания библиотеки вам потребуется создать файл с расширением .lua, если файл будет не найден, функция require ищет файл в определённых каталогах: (1) ./ ./lib/ ./usr/lib/ ./home/lib/ Ваша библиотека должна обязательно выглядеть так: http://pastebin.com/q342F8y6. Для инициализации вашей библиотеки нужно использовать функцию require(имя вашей библиотеки без расширения). Для примера возьмем имя "MyFirstLib". local lib = require('MyFirstLib') Каким образом работает require? require(имя вашей библиотеки без расширения) обходит по каталогам (1) в поисках файла, с именем который вы передали через аргументы, расширение ".lua" не требуется писать. Если файл существует он загружаться с помощью load, поскольку load создаёт функцию, в конце библиотеки нужно возвращать таблицу с полезными функциями. Библиотека сохраняется в package.loaded.имяБиблиотеки, то есть, если изменить исходники библиотеки, изменения не вступят в силу до перезагрузки компьютера, либо до принудительного присвоения package.loaded.имяБиблиотеки = nil. Если вы не будете возвращать таблицу, require возвращает - true. На этом всё, я думаю вам удалось создать правильную и работающую библиотеку, а если нет - пиши сюда, вам помогут. 5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 722 Опубликовано: 27 марта, 2016 (изменено) Для примера возьмем имя "myfirstlib". Я бы написал my_first_lib чтобы не делать трудно читаемый текст, ну или на крайний случай MyFirstLib, но некак не myfirstlib. Отличный гайд, но по такому случаю мог бы рассказать и про dofile заодно. Как я понимаю у неё схожее применение. Кстати, допиши чтобы игроки глобальные переменные не создавали в библиотеках. А то ошибки посыпятся у игроков. Изменено 27 марта, 2016 пользователем qwertyMAN Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO Автор темы 541 Опубликовано: 27 марта, 2016 Кстати, допиши чтобы игроки глобальные переменные не создавали в библиотеках. А то ошибки посыпятся у игроков. Вообще по идеи библиотека оборачивается в функцию и по смыслу там локальные переменные. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
LeshaInc 625 Опубликовано: 27 марта, 2016 (изменено) есть установленные в lua сообществах принципы именования. local myCoolVariable = 10 -- переменная local MyClass = class{...} -- класс require("nano_game") -- либа require("nano_game.graphics") -- либа с сублибами придерживайтесь их, дабы улучшить читабельность. Изменено 27 марта, 2016 пользователем LeshaInc 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 903 Опубликовано: 28 марта, 2016 (изменено) Самое главное-то забыл упомянуть. По сути каждая библиотека - это банальный массив, который возвращается после исполнения файла. А любая функция, загружающая файлы, будь то require, load или dofile, преобразует содержимое файла в самую обычную функцию и исполняет ее, а из этой функции идет возврат содержимого библиотеки. Это очень тонкий момент, который крайне необходим для понимания сути Lua. А то делаем всякие return'ы, а новички не понимают, для чего оно надо. Также стоит добавить, что функция require("имяЛибы") постоянно хранит загруженную библиотеку в package.loaded.имяЛибы. То есть если ты изменишь исходник библиотеки, то изменения не вступят в силу до перезагрузки компьютера, либо до принудительного присвоения package.loaded.имяЛибы = nil. Это далеко не всегда удобно, и лично я предпочитаю использовать классический load(). Кроме того, вовсе необязательно хранить библиотеку в указанных Neo директориях. Я свободный человек, и могу закидывать свои файлы куда пожелаю, а функция require() поддерживает любой указанный путь. А если файл из указанного пути не найден - она начнет искать его в стандартных путях для библиотек. Изменено 28 марта, 2016 пользователем ECS 6 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Multirez 15 Опубликовано: 14 сентября, 2016 А как сделать, чтобы в интерпретаторе lua при попытке писать =require("myLib") выдавало справку по функциям, как для стандартных библиотек OpenComputers а то у меня выдает только названия функций: {myFunction=function ... ...} а я хочу чтобы у функций было видно входные переменные с названиями и описанием от автора, куда это описание написать нужно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO Автор темы 541 Опубликовано: 14 сентября, 2016 ... Это определяется в моде. Можно переписать require так что бы он доки находил и выводил. Где - то была тема на форуме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Multirez 15 Опубликовано: 14 сентября, 2016 Это определяется в моде. Можно переписать require так что бы он доки находил и выводил. Где - то была тема на форуме. А ссылочку на тему? Или примерчик как делать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO Автор темы 541 Опубликовано: 14 сентября, 2016 (изменено) А ссылочку на тему? Или примерчик как делать? Где - то была тема Используй аннотацию Callback, есть аргумент doc, ему присваивается дока или модифицируй require. Изменено 22 сентября, 2017 пользователем Alex Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Multirez 15 Опубликовано: 14 сентября, 2016 модифицируй require. Тут вроде бы как для новичков тема, как создать библиотеку, но ответ ваш не для новичков, что значит перепиши require? Как вообще переписанный require должен повлиять на то, что показывает оператор = в lua интерпретаторе для OC? И, допустим я перепишу require, допустим я сделаю это и у меня на компе чудесным образом появится справка для моей либы, дальше что, мне нужно вместе с либой предоставлять свой require для людей, чтобы они могли справку увидеть? Как это будет: Вот вам библиотека и вот вам мой require, ведь стандартный не показывает справку по моей либе! Так это должно быть!? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
LeshaInc 625 Опубликовано: 14 сентября, 2016 (изменено) можно так local function wrap(fn, desc) return setmetatable({}, { __call = function (_, ...) return fn(...) end, __tostring = function () return desc end }) end local test = { something = wrap(function () return 42 end, "function (): number -- does cool things") } print(tostring(test.something), test.something()) = в оболочке луа просто показывает ключи таблицы и их содержимое при помощи tostring(). такой вариант пойдет. Изменено 14 сентября, 2016 пользователем LeshaInc 5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ALeXeR 67 Опубликовано: 15 сентября, 2016 я бы уточнил что имеется в виду библиотека OpenOS, хотя MineOS (что есть просто оболочка а не ос), как и OpenOS таким-же способом работает Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Multirez 15 Опубликовано: 15 сентября, 2016 = в оболочке луа просто показывает ключи таблицы и их содержимое при помощи tostring() спасибо за развернутый ответ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
jangogo 0 Опубликовано: 22 сентября, 2017 Спасибо! Теперь многое стало понятно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах