Перейти к публикации
Форум - ComputerCraft
NEO

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

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

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

 

 

 

 


 

Библиоте́ка (от англ. library) в программировании — сборник подпрограмм или объектов, используемых для разработки программного обеспечения (ПО).

 


 

Перед тем как писать свою библиотеку определите её необходимость и используйте поиск по форуму, возможно кто - то уже написал подобную библиотеку.

Если такой библиотеки вы не нашли и определились в её необходимости, тогда приступайте к её реализации.

 

 

 

 


 

Для правильного создания библиотеки вам потребуется создать файл с расширением .lua, если файл будет не найден, функция require будет искать файл в определённых каталогах:

 


 

 

 

(1)

./

./lib/

./usr/lib/

./home/lib/

 

Ваша библиотека должна обязательно выглядеть так: http://pastebin.com/q342F8y6.

 

Для инициализации вашей библиотеки нужно использовать функцию require(имя вашей библиотеки без расширения).

Для примера возьмем имя "MyFirstLib".

local lib = require('MyFirstLib')

Каким образом работает require?

  •    require(имя вашей библиотеки без расширения) ищет по каталогам(1) файл, с именем который вы передали в require  ,".lua" не нужно писать, require сам добавит.
  •    Если файл существует он загружаться с помощью load, так как load создаёт функцию, в конце библиотеки нужно возвращать таблицу с полезными функциями. 
  •    Библиотека сохраняется в package.loaded.имяБиблиотеки, то есть если изменить исходники библиотеки, то изменения не вступят в силу до перезагрузки компьютера, либо до принудительного присвоения package.loaded.имяБиблиотеки = nil. 
  •    Если вы не будете возвращать таблицу, require возвратит true или - же таблицу с полезными функциями.

 

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

 

 

 

Изменено пользователем NEO
  • Like 4

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


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

 

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

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

 

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

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

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


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

 

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

 

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

  • Like 1

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


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

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

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

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

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

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


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

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

 

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

 

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

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

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


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

А как сделать, чтобы в интерпретаторе 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
  • Like 4

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


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

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

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


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

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

 

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

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


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×