ShadoWalkeR
Ну дампать в моем случае редко надо, скорей наоборот - загружать откуда то логику, но спасибо за наводки - поковыряю на работе
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
Используй переменную, к которой присваиваешь эту таблицу.
То есть если я поменяю внешнюю переменную, мне потом по всему скрипт менять её?
Зачем?
Мало информации, чтобы даже понять, что ты хочешь.
ShadoWalkeR
Мне нужно внутри одной функции таблицы дернуть другую функцию этой таблицы, не прибегая к каким либо внешним идентификаторам
Приведи минимальный листинг, на котором видно проблему.
И да, print a — синтаксически неверная конструкция.
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
примерно понял идею