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


Фотография

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


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 19

#1 Оффлайн   NEO

NEO
  • Пользователи
  • Сообщений: 1 780
  • Уровень сигнала: 4,24%
  • В игре: 36 час. 25 мин.
  • ГородСолнце

Награды

   3                        

Отправлено 27 Март 2016 - 20:54

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

 

 

 

 

 

 

Библиоте́ка (от англ. 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: 23 Сентябрь 2017 - 21:41

  • Programist135, ECS, Litvinov и еще 1 это нравится

#2 Оффлайн   qwertyMAN

qwertyMAN
  • Пользователи
  • Сообщений: 1 458
  • Уровень сигнала: 0,22%
  • В игре: 1 час. 54 мин.
  • ГородCity17

Награды

                             

Отправлено 27 Март 2016 - 21:07

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

 

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

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

 

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


Сообщение отредактировал qwertyMAN: 27 Март 2016 - 21:10


#3 Оффлайн   NEO

NEO
  • Автор темы
  • Пользователи
  • Сообщений: 1 780
  • Уровень сигнала: 4,24%
  • В игре: 36 час. 25 мин.
  • ГородСолнце

Награды

   3                        

Отправлено 27 Март 2016 - 21:10

 

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

 

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


  • ECS это нравится

#4 Оффлайн   LeshaInc

LeshaInc
  • Пользователи
  • Сообщений: 1 213
  • Уровень сигнала: 13,7%
  • В игре: 117 час. 41 мин.
  • ГородЛуна

Награды

                       

Отправлено 27 Март 2016 - 21:35

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

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

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


Сообщение отредактировал LeshaInc: 27 Март 2016 - 21:35

  • ECS это нравится

#5 Оффлайн   ECS

ECS
  • Гуру
  • Сообщений: 204
  • Уровень сигнала: 0,49%
  • В игре: 4 час. 10 мин.
  • ГородСанкт-Петербург

Награды

   10                  

Отправлено 28 Март 2016 - 07:45

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

 

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

 

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


Сообщение отредактировал ECS: 28 Март 2016 - 11:37


#6 Оффлайн   denchik

denchik
  • Пользователи
  • Сообщений: 5
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 13 Июнь 2016 - 15:33

куда именно пихать её?



#7 Оффлайн   Fingercomp

Fingercomp
  • Гуру
  • Сообщений: 2 015
  • Уровень сигнала: 148,95%
  • В игре: 1279 час. 35 мин.

Награды

                                               

Отправлено 13 Июнь 2016 - 15:56

Мне одному кажется, что это на человеческом языке написано прямо в самом начале первого поста топика?

1465822465.png

...Или у меня глюки?



#8 Оффлайн   denchik

denchik
  • Пользователи
  • Сообщений: 5
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 13 Июнь 2016 - 17:43

но где эти либы там же вот так ./lib а где начало :excl: :excl: :excl:


Сообщение отредактировал denchik: 13 Июнь 2016 - 17:44


#9 Оффлайн   Zer0Galaxy

Zer0Galaxy
  • Гуру
  • Сообщений: 1 230
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

   5                              

Отправлено 13 Июнь 2016 - 17:48

@denchik, в папку /lib/ и пихаешь. Чего тут не ясного? Какое тебе начало нужно?


  • LuaGamer это нравится

#10 Оффлайн   qwertyMAN

qwertyMAN
  • Пользователи
  • Сообщений: 1 458
  • Уровень сигнала: 0,22%
  • В игре: 1 час. 54 мин.
  • ГородCity17

Награды

                             

Отправлено 13 Июнь 2016 - 19:35

@denchik, в папку /lib/ и пихаешь. Чего тут не ясного? Какое тебе начало нужно?

Большой взрыв / вселенная / галактика млечный путь / солнечная система / планета Земля / интернет сеть / наш сервер / твой комп / папка lib /


  • Fingercomp, davial, MrAbad и 3 другим это нравится

#11 Оффлайн   davial

davial
  • Пользователи
  • Сообщений: 454
  • Уровень сигнала: 14,23%
  • В игре: 122 час. 17 мин.
  • ГородТроон в системе Канопуса.

Награды

                       

Отправлено 13 Июнь 2016 - 19:42

Большой взрыв / вселенная / галактика млечный путь / солнечная система / планета Земля / интернет сеть / наш сервер / твой комп / папка lib /

Точно. Только ты - не тому ответил. :giggle: Точнее : надо было в ответ и Денчика добавить.


Сообщение отредактировал davial: 13 Июнь 2016 - 19:43


#12 Оффлайн   Multirez

Multirez
  • Пользователи
  • Сообщений: 6
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 14 Сентябрь 2016 - 14:37

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

 

=require("myLib")

 

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

 

dASta4j.png

 

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

 

{myFunction=function

...

...}

 

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



#13 Оффлайн   NEO

NEO
  • Автор темы
  • Пользователи
  • Сообщений: 1 780
  • Уровень сигнала: 4,24%
  • В игре: 36 час. 25 мин.
  • ГородСолнце

Награды

   3                        

Отправлено 14 Сентябрь 2016 - 14:44

...

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



#14 Оффлайн   Multirez

Multirez
  • Пользователи
  • Сообщений: 6
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 14 Сентябрь 2016 - 14:48

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

 

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



#15 Оффлайн   NEO

NEO
  • Автор темы
  • Пользователи
  • Сообщений: 1 780
  • Уровень сигнала: 4,24%
  • В игре: 36 час. 25 мин.
  • ГородСолнце

Награды

   3                        

Отправлено 14 Сентябрь 2016 - 15:49

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

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

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


Сообщение отредактировал Alex: 22 Сентябрь 2017 - 16:27


#16 Оффлайн   Multirez

Multirez
  • Пользователи
  • Сообщений: 6
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 14 Сентябрь 2016 - 20:01

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

 

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

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



#17 Оффлайн   LeshaInc

LeshaInc
  • Пользователи
  • Сообщений: 1 213
  • Уровень сигнала: 13,7%
  • В игре: 117 час. 41 мин.
  • ГородЛуна

Награды

                       

Отправлено 14 Сентябрь 2016 - 20:10

можно так

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: 14 Сентябрь 2016 - 20:11

  • Zer0Galaxy, NEO, Totoro и еще 1 это нравится

#18 Оффлайн   ALeXeR

ALeXeR
  • Пользователи
  • Сообщений: 204
  • Уровень сигнала: 29,8%
  • В игре: 255 час. 59 мин.
  • ГородОдесса

Отправлено 15 Сентябрь 2016 - 09:11

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



#19 Оффлайн   Multirez

Multirez
  • Пользователи
  • Сообщений: 6
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 15 Сентябрь 2016 - 15:51

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

 

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



#20 Оффлайн   jangogo

jangogo
  • Пользователи
  • Сообщений: 6
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 22 Сентябрь 2017 - 15:43

Спасибо! Теперь многое стало понятно.






Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных