ShadoWalkeR
Ну дампать в моем случае редко надо, скорей наоборот - загружать откуда то логику, но спасибо за наводки - поковыряю на работе
Alxius
Group Butler [beta]
Добро пожаловать в чат pro.lua, Danil! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.
Group Butler [beta]
Добро пожаловать в чат pro.lua, ShadoWalkeR! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.
ShadoWalkeR
Вопрос к знатокам - есть файл с примерно таким содержанием
local tbl = {}
tbl.abc = function()
print a;
end;
tbl.def = function()
end;
return tbl;
Как мне в теле def дернуть abc? Какой нибудь selftable или чтото в этом духе есть?
ㅤ
tbl.abc()?
ShadoWalkeR
attempt to index global 'tbl' (a nil value)
ShadoWalkeR
Обожаю буфер обмена в линуксе
Aleksey
https://habrahabr.ru/post/259265/
ㅤ
Почему её нет, если ты её только что чуть выше определил?
Aleksey
вот тут хорошо написано
ㅤ
Или ты хочешь где-то переопределить def?
ShadoWalkeR
Потому что я дергаю это извне. Там таблица присваивается переменной и local tbl походу уже не существует
ㅤ
Используй переменную, к которой присваиваешь эту таблицу.
ㅤ
Название переменной другое, но таблица-то та же самая.
ㅤ
Зачем?
ㅤ
Мало информации, чтобы даже понять, что ты хочешь.
ShadoWalkeR
Мне нужно внутри одной функции таблицы дернуть другую функцию этой таблицы, не прибегая к каким либо внешним идентификаторам
ㅤ
Приведи минимальный листинг, на котором видно проблему.
ㅤ
И да, print a — синтаксически неверная конструкция.
ShadoWalkeR
ShadoWalkeR
templates.lua;
local tbl ={
["checkDials"] = function(context,exten)
—логика
end;
["phone_check"] = function(context, exten)
—нужно вызвать checkDials
end;
}
return tbl;
extensions.lua:
template = dofile(GLOBALS.ETC .. "templates.lua");
extensions = {};
extensions["outgoing"] = {
["_X."] = template.phone_check;
}
ShadoWalkeR
Привязываться к template не вариант - это говнокод
ㅤ
local tbl
tbl = { ....
ㅤ
Или как в первом примере: сначала создаёшь таблицу, затем записываешь в неё функции.
ShadoWalkeR
Ну, а в рантайме у меня tbl не существует
ㅤ
А ты попробовал?
ㅤ
На момент исполнения функций очень даже существует, но в твоём примере они её не "видят".
ShadoWalkeR
Мда
ShadoWalkeR
В некоторых моментах продуманность ЯП в тупик ставит
Anonymous
Опишу другой пример:
Рекурсивная функция загружается из файла, имя можно произвольное дать.
Как рекурсивной функции вызвать саму себя если она не знает своего имени?
ShadoWalkeR
Забавно ведет себя Lua в некоторых моментах
Anonymous
do
local function hello(x)
if x then
print("hello, x")
hello()
else
print("dude hi")
end
end
hello(1)
hi=hello
end
hello = nil
hi(2)
Вот поди, разберись. Прочитал, что так должно работать. Но почему?
Кто на ПК, загрузите через require / dofile вместо do ... end - работает?
Anonymous
Upvalues in Lua
https://www.lua.org/pil/27.3.3.html
https://www.lua.org/pil/23.1.2.html
Snusmumriken
Snusmumriken
Хотя в целом, модули делаются примерно так:
module.lua
local M = {}
function M.foo(x, y)
return x + y
end
return M
main.lua
local mod = require'module'
print(M) --> nil -- локальное в другом модуле, не видно
print(mod.foo(10, 20)) --> 30
ShadoWalkeR
Я тут сегодня забавное поведение у луа нашел
ShadoWalkeR
В астериске надо объявить таблицу extensions
В нее складывать контексты и экстены, контекст - вложенная в extensions таблица, а экстен уже ключ, на которую вешается функция
ShadoWalkeR
Суть в том, что в такую функцию попадает 2 аргумента - context и exten - то что дергает астериск.
ShadoWalkeR
Предположим я делаю в файле так:
function abc(context, exten)
end;
extensions = {}
extensions.default = {}
extensions.default.100 = abc;
Все работает на этой логике
Snusmumriken
Хе, карочи оно работает как колбеки?
module = {}
function module.foo(context, extension)
context.foo(10)
extension.foo = 20
end
context:setCallbacks(module) -- типа теперь он на события будет дёргать функции из этой таблички
Типа такого?
Snusmumriken
Или глобальную таблицу extensions пытается расковыривать?
ShadoWalkeR
НО! стоит мне вынести функции вынести в огтедльный файл и вгрузить его через dofile например так:
template = dofile(templates.lua)
extensions = {}
extensions.default = {}
extensions.default.100 = template.abc;
ShadoWalkeR
То в abc попадает только второй аргумент.
ShadoWalkeR
А если я в этом файле сделаю abc функцией которая возвращет функцию с тем же телом, то context снова появляется)
Snusmumriken
Хе, вот это может быть неправильным использованием двоеточия obj:method().
Хм.
Но в целом, это неправильно, на месте должны быть все аргументы.
Snusmumriken
Проверь, не делаешь ли ты чего-то неправильного. Не объявляешь/перетираешь ли ты в templates что-то глобальное и т.п.
ShadoWalkeR
Неа. Я просто вынес все функции в файл, который возвращает таблицу из них
Snusmumriken
Ты хочешь setenv'ом задавать таблицу модуля вместо окружения?
Snusmumriken
Ну а в примере как раз оно.
Библиотека возвращает локальную таблицу с функциями, и не делает ничо глобального.
Snusmumriken
Ммм.
Ты имеешь ввиду что между
local function foo(x, y) ... end
return {foo = foo}
и
local M = {}
function M.foo(x, y) ... end
return M
есть разница?
Snusmumriken
В первом варианте, истинными локальными работают функции.
Snusmumriken
А то что появляется состояние - это довольно часто необходимо.
Особенно когда твоя библиотека - КЛАСС.
Snusmumriken
Ну, просто я не делаю библиотек "с функциями", я делаю библиотеки с классами-фабриками.
Их невозможно сделать иначе.
Snusmumriken
Кратко говоря, от одного замыкания на модуль - ничего страшного не будет, особенно учитывая кеширование на require.
Alxius
Vyt мне вот интересно , Если я передам функции только 3 параметра, что она сделает с 4м? не тронет? (что хотелось бы) или запишет nil? function class_enemy:set(type,x2,y2,hp)
self.type = type;
self.x2 = x2;
self.y2 = y2;
self.hp = hp;
Anonymous
nil
Anonymous
default:
local hp = hp or 100
Alxius
так и думал спасибо)
Alxius
да не дефаулт надо. а просто не трогать
Alxius
уже читал и уже даже использовал. но nil меня тогда устраивал
Anonymous
local hp = hp or self.hp
Group Butler [beta]
Добро пожаловать в чат pro.lua, Kirill! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.
Kirill
Привет, ребята, я тут новенький в lua, функция len, которая решетка, какую имеет алгоритмическую сложность? O(n)?
Kirill
Или O(log n)?
Snusmumriken
Ну кароч если нужно много раз вычислять - сохраняешь и используешь. Можешь прибавлять/убавлять единичку при добавлении/удалении значений.
Vsevolod
это не нужно в luajit...
Group Butler [beta]
Добро пожаловать в чат pro.lua, 79885! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.
Group Butler [beta]
Добро пожаловать в чат pro.lua, Pavel! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.
Pavel
Всем привет. кто подскажет что означает ошибка lua - function: 0x8f7010
Pavel
в онлайн тесте на http://rextester.com/l/lua запускаю такой скрипт тестовый
Pavel
--lua 5.3
p_body = "</script><div id=\"index\"><h2>text</h2><table width</div>"
for div_index in p_body:gmatch("<div id=\"index\"(.-)</div>") do
print(div_index)
h2_name = p_body:gmatch("<h2😠.-)</h2>")
print(h2_name)
end
mva
это не ошибка
Aleksey
++
Aleksey
причем у тебя выше же for по итератору
Pavel
понял. т.к. нужен for. извините. я в lua нулевой
Pavel
да. это у меня мелкий парсер html странички
Pavel
пытаюсь его немного подправить...
Pavel
примерно понял идею