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
Highly Likely
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
Ну, суть не в том чтобы вывод соответствовал, а в том чтобы все функции работали даже при переопределении.
Artem
Snusmumriken
Изменение полного механизма таблиц? )
Anonymous
Можно повесить метатаблицу на _G, где в newindex проверять type и если это table, то там уже навешивать сверху метатаблицу, которая на новые индексы может навешивать, например __call
Anonymous
Вот это будет пушка, конечно
Snusmumriken
Методика странная, и работает увы только с глобалами
Александр
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
}
)
Александр
Ну то есть тут базовое решение довольно простое
Александр
А всё же сделать так, чтобы объявляешь любую глобальную таблицу и она становится волшебной - так сильно интереснее
Snusmumriken
Artem
Leon174
А не tbl = setmetatable({} ... ?
Александр
Ну если мы этот участок подставим вместо многоточия, сработает
Александр
Leon174
Если мы раньше tbl нигде не объявили, то это nil. Ну и...
Snusmumriken
Ну это уже мелочи, принципиальная модель та )
Leon174
Просто в глаза бросилось. Прастити, извинити.
Sergey
Александр
Очевидно что мы туда не 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
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.
Какой тебе порядок?
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
Highly Likely
Snusmumriken
Это жесть конечно, но пусть будет.
Anonymous
Просто у программы под которую скрипт пишу есть особенность
Anonymous
Изза нее и приходится делать такой костыль
Snusmumriken
Snusmumriken
А то скорость скрипта начинает даже не линейно, а экспотенциально увеличиваться при засирании _G.
Anonymous
Всмысле вытащить переменные?
Anonymous
Их тут всего может быть от 1 до 10
Anonymous
Anonymous
Есть список allNames, полученный в процессе, его длинна динамична
Anonymous
Далее нужно сделать динамичное меню исходя из этого списка
Anonymous
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
Доделаю)
Anonymous
Спасибо за совет
Snusmumriken
Ну и в целом с этим проще работать, типа сначала вытаскиваешь то что тебе надо, сортируешь, ковыряешь и т.д.
Godruma-vihari Dasa
Я нельзя ли сразу записать в массив tmp[i]? Тогда не нужно искать иголку в стоге сена?
Godruma-vihari Dasa
Кстати, сортировка в Луа до сих пор неустойчивая...
Snusmumriken
Квиксорт базовый не особо устойчив.
Snusmumriken
Кстати, хочешь устойчивую сортировку — напиши ))
Snusmumriken
Я делал целый комплект костыльных бинарных поисков/вставкок и всякой такой фигни для своих грязных целей операций над огромными сортированными массивами. И на чанки их разбивал, балансировал, чтобы вставка-удаление были довольно быстрыми. И пакет сортировок начиная с гномской и пузырьковой, потому что они офигеть какие быстрые на почти сортированных массивах (некоторые соседние элементы поменяны местами), гораздо быстрее квиксорта.
Anonymous
Подскажите пож какой то курс вводный по луа