Size: a a a

2021 April 05

АQ

Андрей QuikTelegram... in Tarantool
блин, что то я уперся в стенку, покажите дверь: есть два модуля chunk1 и chuтk2 на луа, в каждом функция calc(a,b), с разной логикой, как мне подключить эти модули и вызывать эти функции. Я вот так сделал и что то не пошло ((
c1=loadfile ("chunk1.lua")
c2=loadfile ("chunk2.lua")

r = c1.calc(4,5)
print (r)

r = c2.calc(4,5)
print (r)
источник

АQ

Андрей QuikTelegram... in Tarantool
через dofile понятно вторая функция перезатирает первую ((( а как сделать чтоб они были разные ну вообще никак ((
источник

GM

Georgy Moiseev in Tarantool
источник

GM

Georgy Moiseev in Tarantool
Если файл chunk1.lua в конце делает
return { calc = calc }

то Вы в своём файле делаете
c1 = require('chunk1.lua')

и дальше вызываете
r = c1.calc(4, 5)
источник

АQ

Андрей QuikTelegram... in Tarantool
ага, если каждый модули имеют по несколько функций, то их надо каждую вернуть в ретурне в каждом модуле.. щас попробую,  а то я require то пробовал, она мне истину возвращает и все...
источник

АQ

Андрей QuikTelegram... in Tarantool
ура работает, спасибо
package.path = "C:\\Users\\OneDrive\\LUA\\TEST-LUA\\?.lua"
c1=require ("chunk1")
c2=require ("chunk2")
r = c1.calc(4,5)
print (r)
r = c1.sub(4,5)
print (r)
r = c2.calc(4,5)
print (r)
r = c2.sub(4,5)
print (r).

Получается если сделан модуль и хочется его require то он обязательно должен возвращать таблицу со своими функциями return {calc=calc, sub=sub} ?
источник

DS

Dmitry Sharonov in Tarantool
да, об этом проще всего читать в доке по луа
источник

АQ

Андрей QuikTelegram... in Tarantool
да я читал и про регуари только вот return {calc=calc, sub=sub}  не допер ((
источник

DS

Dmitry Sharonov in Tarantool
источник

АQ

Андрей QuikTelegram... in Tarantool
всегда делал dofile, а тут понадобилось два чужих "модуля-недомодуля ((" с одинаковыми имена функций и встрял. а там в них нету ретурна  со всеми таблицами, придется в каждый чужой модуль дозаписывать в конец
источник

YD

Yaroslav Dynnikov in Tarantool
есть еще паттерн

local M = {}
function M.f1() end
function M.f2() end
return M
источник

YD

Yaroslav Dynnikov in Tarantool
Но суть та же - рекваер возвращает то, что ваш модуль делает return
источник

АQ

Андрей QuikTelegram... in Tarantool
а варианта прицепить чужие луа, в которых просто куча функций, с перекликающимися именами и нет ретурна, без изменения чужого кода нет? чтоб я у себя так же мог вызвать m1.calc() или m2.calc() и все ?
источник

АQ

Андрей QuikTelegram... in Tarantool
не хочется в чужом коде вносить изменения, список функций в ретурн вытаскивать (((
источник

VG

Vladislav Grubov in Tarantool
Они там в глобал сетятся что ли?
источник

АQ

Андрей QuikTelegram... in Tarantool
да, в чужих луашниках все функции глобальные объявлены. я тут попробовал а чем плох вариант прописать в начале чужого луа module 'm1'. я попробовал без всяких ретурнов функций реквари срабатывает в варианте m1.calc()
источник

MA

Mons Anderson in Tarantool
Есть. Setfenv
источник

VG

Vladislav Grubov in Tarantool
как-то так: https://pastebin.com/BKNPLyhg

идея проста:
- Ищем модуль на FS
- Берем от него loader (первую фазу require)
- Подменяем ему глобал, чтобы он не испортил глобал приложения
- Проводим рекваер (вторую фазу)
- Работаем с возвратом от модуля (тут как удобно в приложении)
- Кэшируем результат (или не кешируем)

такой подход позволяет не редактировать существующий код
источник

EM

Evgeny Makarov in Tarantool
источник

EM

Evgeny Makarov in Tarantool
Ну не мог я не напомнить о такой хорошей библиотеке! )))
источник