Snusmumriken
О, кстати, смешная задачка: сделать луёвую таблицу, в которую можно добавлять сколько угодно функций, и они бы все вызывались )) Ну там tbl = {} ... function tbl.foo(a, b) print("Hello", a + b) end function tbl.foo(a, b) print("World", a - b) end tbl.foo(10, 20) > Hello 30 > World -10
Snusmumriken
index/newindex и всё
Молодец, возьми с полки пирожок. Но задачка не для твоего уровня, она попроще.
Highly Likely
Snusmumriken
Нет, это действительно метатаблицы, только выглядит примерно как "Дети, вот вам задачка, с какой скоростью корабль доплывёт из пункта А в пункт Б, если ...." и тут препод по математике из соседнего кабинета приходит и такой "2км/ч и всё".
Anonymous
Интереснее было бы, конечно, как-то вот это сделать ... tbl = {} function tbl.foo(a, b) print("Hello", a + b) end function tbl.foo(a, b) print("World", a - b) end tbl.foo(10, 20) > Hello 30 > World -10
Anonymous
Конкретно вот это можно сделать, конечно, переопределив print
Anonymous
А, нет... что-то хитрее должно быть
Snusmumriken
Ну, суть не в том чтобы вывод соответствовал, а в том чтобы все функции работали даже при переопределении.
Snusmumriken
через метатаблицы можно провернуть __newindex
А попробуй сделать ) Оно чуть забавнее чем кажется.
Anonymous
через метатаблицы можно провернуть __newindex
Это если многоточие бы стояло после tbl = {}
Snusmumriken
Изменение полного механизма таблиц? )
Anonymous
Можно повесить метатаблицу на _G, где в newindex проверять type и если это table, то там уже навешивать сверху метатаблицу, которая на новые индексы может навешивать, например __call
Anonymous
Вот это будет пушка, конечно
Snusmumriken
Методика странная, и работает увы только с глобалами
Artem
А попробуй сделать ) Оно чуть забавнее чем кажется.
сдаюсь, у меня терпения не хватит добить эту задачку сейчас)))
Александр
stor = {} tbl = setmetatable( tbl, { __newindex = function(self, key, foo) stor[key] = stor[key] or {} table.insert(stor[key], foo) end, __index = function(self, key) return function(...) for _, f in ipairs(stor[key]) do f(...) end end end } )
Александр
Ну то есть тут базовое решение довольно простое
Александр
А всё же сделать так, чтобы объявляешь любую глобальную таблицу и она становится волшебной - так сильно интереснее
Artem
stor = {} tbl = setmetatable( tbl, { __newindex = function(self, key, foo) stor[key] = stor[key] or {} table.insert(stor[key], foo) end, __index = function(self, key) return function(...) for _, f in ipairs(stor[key]) do f(...) end end end } )
я такое же начал писать, но что-то у меня оно не заработало и я теперь понял что я сделал не так)
Leon174
А не tbl = setmetatable({} ... ?
Александр
Ну если мы этот участок подставим вместо многоточия, сработает
Александр
А не tbl = setmetatable({} ... ?
Но так тоже сработает
Leon174
Если мы раньше tbl нигде не объявили, то это nil. Ну и...
Snusmumriken
Ну это уже мелочи, принципиальная модель та )
Leon174
Просто в глаза бросилось. Прастити, извинити.
Sergey
Александр
Если мы раньше tbl нигде не объявили, то это nil. Ну и...
Если мы раньше tbl нигде не объявили, значит мы не вместо многоточия подставили ведь наш кусок
Александр
Очевидно что мы туда не nil хотим передать, потому что на него навесить метатаблицу чуть сложнее, чем на таблицу "обычную"
Anonymous
Всем привет
Anonymous
Парни, подскажите пожалуйста такой момент
Anonymous
Существуют переменные: tmp1=1 tmp2=2 tmp3=3 И так далее... Нужно собрать все их значения в массив
Anonymous
Как это сделать итерацией?
Anonymous
Сколько таких переменных tmp - определяется длинной другого массива. Нужно что то вроде: t = {} for a=1,#allNames do t[a] = tmp..a end
Anonymous
Но так естественно не работает
Anonymous
Подскажите как сделать
Wsevolod
Как это сделать итерацией?
local result = {} for k, v in pairs(_G) do if k:match"^tmp" then table.insert(result, v) end end
Anonymous
Только одна маленькая проблема
Anonymous
Оно не по порядку пишет
Anonymous
Anonymous
Anonymous
for a=1,#allNames do addTextView('Лимит продажи товара "'..allNames[a]..'"') newRow() addEditNumber("tmp"..a,limits[a]) newRow() end
Anonymous
print(table.concat(t,'\n',1,#t))
Snusmumriken
Выделяешь код и жмёшь alt + shift + m. Какой тебе порядок?
Highly Likely
Оно не по порядку пишет
Pairs недетерминированный
Anonymous
Разобрался уже
Snusmumriken
local result = {} for k, v in pairs(_G) do if k:match"^tmp" then table.insert(result, {key = k, value = v}) end end table.sort(result, function(a, b) return a.key < b.key end) for i, v in ipairs(result) do print(v.key, "-", v.value) end
Anonymous
for k, v in pairs(_G) do for a=1,#allNames do if k:match("tmp"..a) then limits[a] = v end end end
Snusmumriken
Это жесть конечно, но пусть будет.
Anonymous
Это жесть конечно, но пусть будет.
Почему жесть? Именно все так как и нужно мне
Anonymous
Просто у программы под которую скрипт пишу есть особенность
Anonymous
Изза нее и приходится делать такой костыль
Snusmumriken
А то скорость скрипта начинает даже не линейно, а экспотенциально увеличиваться при засирании _G.
Anonymous
Всмысле вытащить переменные?
Anonymous
Их тут всего может быть от 1 до 10
Anonymous
Есть список allNames, полученный в процессе, его длинна динамична
Anonymous
Далее нужно сделать динамичное меню исходя из этого списка
Anonymous
Snusmumriken
for k, v in pairs(_G) do for a=1,#allNames do if k:match("tmp"..a) then limits[a] = v end end end
А что ещё может быть в _G? Сколько мусора ты туда вытащишь? Смотри. Вот эта штука для КАЖДОГО элемента в _G проверяет, если ли ХОТЬ ОДИН элемент соответствующий таблице. Чем больше элементов в _G, тем больше раз выполняется цикл "for ... allNames end". Сложность — N^M, и чем больше какашек в _G (N), тем медленнее оно делается.
Anonymous
Особенность апи программы в том, что оно не дает записать значение меню в переменную свою, нужно создавать новую каждый раз так: for a=1,#allNames do addTextView('Лимит продажи товара "'..allNames[a]..'"') newRow() addEditNumber("tmp"..a,limits[a]) newRow() end dialogShow("SimTrade Seller Bot v.1.1") end
Snusmumriken
Если сначала извлечь все "tmpFOO" и прочие — закаканность _G перестаёт играть такую роль, ибо всё tmp'шное уже вытащено, особенно если фильтр правильно работает по категориям tmp_order_foo, tmp_eventbar_bar и т.д.
Highly Likely
Но Снус прав. Вариант с одним проходом дает n + n log n скорость
Anonymous
Оно не дает сделать так к примеру: tmp = {} for a=1,#allNames do addTextView('Лимит продажи товара "'..allNames[a]..'"') newRow() addEditNumber(tmp[a],limits[a]) newRow() end dialogShow("SimTrade Seller Bot v.1.1") end
Anonymous
Доделаю)
Anonymous
Спасибо за совет
Snusmumriken
Ну и в целом с этим проще работать, типа сначала вытаскиваешь то что тебе надо, сортируешь, ковыряешь и т.д.
Godruma-vihari Dasa
Я нельзя ли сразу записать в массив tmp[i]? Тогда не нужно искать иголку в стоге сена?
Godruma-vihari Dasa
Кстати, сортировка в Луа до сих пор неустойчивая...
Snusmumriken
Квиксорт базовый не особо устойчив.
Snusmumriken
Кстати, хочешь устойчивую сортировку — напиши ))
Snusmumriken
Я делал целый комплект костыльных бинарных поисков/вставкок и всякой такой фигни для своих грязных целей операций над огромными сортированными массивами. И на чанки их разбивал, балансировал, чтобы вставка-удаление были довольно быстрыми. И пакет сортировок начиная с гномской и пузырьковой, потому что они офигеть какие быстрые на почти сортированных массивах (некоторые соседние элементы поменяны местами), гораздо быстрее квиксорта.
Anonymous
Подскажите пож какой то курс вводный по луа
Aydar
Подскажите пож какой то курс вводный по луа
Курсов не знаю, можете попробовать прочитать книгу "Программирование на языке Lua" написано достаточно простыми словами.