--lua
table = {'Год', 'Месяц', 'День'}
table["Год"] = {'2020', '2021', '2022'}
table["Месяц"] = {'Январь', 'Февраль', 'Март'}
table["Месяц"]["Январь"] = {'Утро', 'День', 'Вечер'}
table["Месяц"]["Февраль"] = {'Вечер'}
function DATA(tbl)
NewDATA = table["Месяц"]["Январь"] -- как отбросить ["Январь"] ?
return NewDATA
end
e = DATA(table["Месяц"]["Январь"])
msg(unpack(e))
Лучше напишите что вообще хотите сделать.
table не самое лучше имя для таблицы, оно хоть и не зарезервировано, но может привести к ошибке.
Я пытаюсь при помощи вашего плагина Prompt пообщаться с пользователем. Выдать ему иерархическое дерево с разделами, подразделами, подподразделами, что, в конечном итоге, должно привести к конечному значению, которое дальше должно быть использовано в скрипте.
Пользователь путем многоуровневого Prompt (выбор с каталогами, подкаталогами и так далее) взаимодействует с функцией, в которую передаёт свой выбор. Функция принимает значения и выдает варианты выбранного ранее. В эту сторону вроде как проблем нет, но необходимо чтобы пользователь мог вернуться назад, к предыдущему выбору. Вот здесь засада.
Пытался найти инфу как узнать имя таблицы, значения которой передаются в функцию. Но то ли функции придумали контрабандисты, полагающие, что лишняя инфа ей только навредит, то ли я просто не нашёл то что искал. Но самая беда в том, что я даже не знаю что погуглить. Вы правильно заметили, проблема с подходом. Я бы и рад его пересмотреть - но подглядеть некуда
--lua
t = {
[1] = 'Год',
[2] = 'Месяц',
[3] = 'День',
["Год"] = {
'2020',
'2021',
'2022'
},
["Месяц"] = {
[1] = 'Январь',
[2] = 'Февраль',
[3] = 'Март',
["Январь"] = {
'Утро',
'День',
'Вечер'
},
["Февраль"] = {
'Вечер'
}
},
}
for k,v in pairs(t) do
log(k)
end
Вроде работает
--lua
t = {'Год', 'Месяц', 'День'}
t["Год"] = {'2020', '2021', '2022'}
t["Месяц"] = {'Январь', 'Февраль', 'Март'}
t["Месяц"]["Январь"] = {'Утро', 'День', 'Вечер'}
t["Месяц"]["Февраль"] = {'Вечер'}
function DATA(tbl)
local t2 = tbl or t
for k,v in pairs(t) do
if v == t2 then
NewDATA = t
return NewDATA
end
if type(v) == 'table' then
for n, m in pairs(v) do
if m == t2 then
NewDATA = t[k]
return NewDATA
end
end
end
end
return t2
end
e = DATA(t["Месяц"]["Январь"])
msg(unpack(e))
Madeus, да, вот то что я задумывал, но к сожалению сам так и не осилил. К тому же, пока что многочасовые попытки понять механику вашего варианта, как вы это сделали, пока тщетны. И применить для свой задачи не получается Не могли бы вы свой вариант адаптировать под конкретный случай?
У товарища cirus в разделе "Плагины и доп. ПО" есть https://forum.uokit.com/index.php?s=&showtopic=70550&view=findpost&p=439502 для команды Prompt. Я пытаюсь выдать пользователю структурный выбор с возможностью возвращаться назад.
--lua
h = require'prompt'
t = {'Год', 'Месяц', 'День', 'стоп'}
t["Год"] = {'2020', '2021', '2022', 'назад', 'стоп'}
t["Месяц"] = {'Январь', 'Февраль', 'Март', 'назад', 'стоп'}
t["Месяц"]["Январь"] = {'Утро', 'День', 'Вечер', 'назад', 'стоп'}
t["Месяц"]["Февраль"] = {'Вечер', 'назад', 'стоп'}
function DATA(tbl)
local t2 = tbl or t
for k,v in pairs(t) do
if v == t2 then
NewDATA = t
return NewDATA
end
if type(v) == 'table' then
for n, m in pairs(v) do
if m == t2 then
NewDATA = t[k]
return NewDATA
end
end
end
end
return t2
end
local handle = windowfromcursor()
workwindow(handle)
local x, y, width, height, errorcode = windowpos (handle)
local HintX = width / 3 + x - 100
local HintY = height + 200
h.promptposX = HintX
h.promptposY = HintY
::UserPrompt::
param, EndValue = DATA(param)
h.lua_prompt(param)
if not EndValue then
goto UserPrompt
else
goto FieldData
end
::FieldData::
msg(EndValue)
stop_script()
Суть примерно такая, остальное по аналогии.
--lua
local h = require'prompt'
local t = {'Год', 'Месяц', 'День', 'стоп'}
t["Год"] = {'2020', '2021', '2022', 'назад', 'стоп'}
t["День"] = {'Понедельник', 'Вторник', 'назад', 'стоп'}
t["Месяц"] = {'Январь', 'Февраль', 'Март', 'назад', 'стоп'}
t["Месяц"]["Январь"] = {'Утро', 'День', 'Вечер', 'назад', 'стоп'}
t["Месяц"]["Февраль"] = {'Вечер', 'назад', 'стоп'}
log 'clear' log 'mode compact'
local result = h.lua_prompt(t)
if t[result] == nil or t[result] == 'стоп' then
end_script()
else
result = h.lua_prompt(t[t[result]])
log( result )
end
--lua
local h = require'prompt'
t = {'Год', 'Месяц', 'День', 'стоп'}
t["Год"] = {'2020', '2021', '2022', 'назад', 'стоп'}
t["День"] = {'Понедельник', 'Вторник', 'назад', 'стоп'}
t["Месяц"] = {'Январь', 'Февраль', 'Март', 'назад', 'стоп'}
t["Месяц"]["Январь"] = {'Утро', 'День', 'Вечер', 'назад', 'стоп'}
t["Месяц"]["Февраль"] = {'Вечер', 'назад', 'стоп'}
log 'clear' log 'mode compact'
function MyPrompt (t, n, prev)
n = h.lua_prompt(t)
if type(t[t[n]]) == 'table' then
prev = t
t = t[t[n]]
return t, n, prev
else
if t[n] == 'назад' then
t = prev
return t, n, prev
end
if t[n] == 'стоп' then
end_script()
end
t = t[n]
return t
end
end
prev = t
n = h.lua_prompt(t)
t = t[t[n]]
::u::
t, n, prev = MyPrompt (t, n, prev)
if type(t) == 'table' then
goto u
else
msg(t)
end_script()
end
Присвоение:
888
Два
Копирование:
1
Два
Прям напрямую - нет, копировать нельзя. Обычно вот этого достаточно:
function table.clone(org)
return {table.unpack(org)}
end
unpack(org)
--lua
local h = require'prompt'
t = {'Год', 'Месяц', 'День', 'стоп'}
t["Год"] = {'2020', '2021', '2022', 'назад', 'стоп'}
t["День"] = {'Понедельник', 'Вторник', 'назад', 'стоп'}
t["Месяц"] = {'Январь', 'Февраль', 'Март', 'назад', 'стоп'}
t["Месяц"]["Январь"] = {'Утро', 'День', 'Вечер', 'назад', 'стоп'}
t["Месяц"]["Февраль"] = {'Вечер', 'назад', 'стоп'}
log 'clear' log 'mode compact'
function MyPrompt (t, n, prev)
n = h.lua_prompt(t)
if type(t[t[n]]) == 'table' then
if prev[#prev] ~= t then
prev[#prev+1] = t
end
t2 = t[t[n]]
return t2, n, prev
else
if t[n] == 'назад' then
if #prev > 1 then
t2 = prev[#prev]
table.remove(prev)
return t2, n, prev
end
t2 = prev[#prev]
return t2, n, prev
end
if t[n] == 'стоп' then
end_script()
end
t2 = t[n]
return t2
end
end
prev = {t}
n = h.lua_prompt(t)
t = t[t[n]]
::u::
t, n, prev = MyPrompt (t, n, prev)
if type(t) == 'table' then
goto u
else
msg(t)
end_script()
end
фонарик, обрати внимание на еще одну особенность.
К сожалению, в луа переменные по умолчанию создаются в глобальной области видимости,
так что при инициализации переменной внутри функции, нужно использовать модификатор local,
чтобы она не существовала за ее пределами.
Пример:
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)