Перейти к содержимому
NEO

Как создать библиотеку.

Рекомендуемые сообщения

Предисловие

 

Для начала мы разберёмся зачем библиотека?

 

Библиоте́ка (от англ. 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.

 

На этом всё, я думаю вам удалось создать правильную и работающую библиотеку, а если нет - пиши сюда, вам помогут.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Для примера возьмем имя "myfirstlib".

 

Я бы написал my_first_lib чтобы не делать трудно читаемый текст, ну или на крайний случай MyFirstLib, но некак не myfirstlib.

Отличный гайд, но по такому случаю мог бы рассказать и про dofile заодно. Как я понимаю у неё схожее применение.

 

Кстати, допиши чтобы игроки глобальные переменные не создавали в библиотеках. А то ошибки посыпятся у игроков.

Изменено пользователем qwertyMAN

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

Кстати, допиши чтобы игроки глобальные переменные не создавали в библиотеках. А то ошибки посыпятся у игроков.

 

Вообще по идеи библиотека оборачивается в функцию и по смыслу там локальные переменные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

есть установленные в lua сообществах принципы именования.

local myCoolVariable = 10  -- переменная
local MyClass = class{...}  -- класс
require("nano_game")  -- либа
require("nano_game.graphics") -- либа с сублибами

придерживайтесь их, дабы улучшить читабельность.

Изменено пользователем LeshaInc

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Самое главное-то забыл упомянуть. По сути каждая библиотека - это банальный массив, который возвращается после исполнения файла. А любая функция, загружающая файлы, будь то require, load или dofile, преобразует содержимое файла в самую обычную функцию и исполняет ее, а из этой функции идет возврат содержимого библиотеки. Это очень тонкий момент, который крайне необходим для понимания сути Lua. А то делаем всякие return'ы, а новички не понимают, для чего оно надо.

 

Также стоит добавить, что функция require("имяЛибы") постоянно хранит загруженную библиотеку в package.loaded.имяЛибы. То есть если ты изменишь исходник библиотеки, то изменения не вступят в силу до перезагрузки компьютера, либо до принудительного присвоения package.loaded.имяЛибы = nil. Это далеко не всегда удобно, и лично я предпочитаю использовать классический load().

 

Кроме того, вовсе необязательно хранить библиотеку в указанных Neo директориях. Я свободный человек, и могу закидывать свои файлы куда пожелаю, а функция require() поддерживает любой указанный путь. А если файл из указанного пути не найден - она начнет искать его в стандартных путях для библиотек.

Изменено пользователем ECS

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А как сделать, чтобы в интерпретаторе lua при попытке писать

 

=require("myLib")

 

выдавало справку по функциям, как для стандартных библиотек OpenComputers

 

dASta4j.png

 

а то у меня выдает только названия функций:

 

{myFunction=function

...

...}

 

а я хочу чтобы у функций было видно входные переменные с названиями и описанием от автора, куда это описание написать нужно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

...

Это определяется в моде. Можно переписать require так что бы он доки находил и выводил. Где - то была тема на форуме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Это определяется в моде. Можно переписать require так что бы он доки находил и выводил. Где - то была тема на форуме.

 

А ссылочку на тему? Или примерчик как делать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А ссылочку на тему? Или примерчик как делать?

 Где - то была тема

Используй аннотацию Callback, есть аргумент doc, ему присваивается дока или модифицируй require.

Изменено пользователем Alex

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

модифицируй require.

 

Тут вроде бы как для новичков тема, как создать библиотеку, но ответ ваш не для новичков, что значит перепиши require? Как вообще переписанный require должен повлиять на то, что показывает оператор = в lua интерпретаторе для OC?

И, допустим я перепишу require, допустим я сделаю это и у меня на компе чудесным образом появится справка для моей либы, дальше что, мне нужно вместе с либой предоставлять свой require для людей, чтобы они могли справку увидеть? Как это будет: Вот вам библиотека и вот вам мой require, ведь стандартный не показывает справку по моей либе! Так это должно быть!?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

можно так

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(). такой вариант пойдет.

Изменено пользователем LeshaInc

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

я бы уточнил что имеется в виду библиотека OpenOS, хотя MineOS (что есть просто оболочка а не ос), как и OpenOS таким-же способом работает

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

= в оболочке луа просто показывает ключи таблицы и их содержимое при помощи tostring()

 

спасибо за развернутый ответ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...