У меня вопрос по LUA / LuCI.Я хочу добавить mymodule в конце индексную таблицу в функцию createindex .
В этом коде:
local controllers = { }
local base = "%s/controller/" % util.libpath()
local _, path
for path in (fs.glob("%s*.lua" % base) or function() end) do
controllers[#controllers+1] = path
end
for path in (fs.glob("%s*/*.lua" % base) or function() end) do
controllers[#controllers+1] = path
end
Он просматривает в этих каталогах файлы lua и заполняет контроллер таблицу, затем в этом коде:
index = {}
for _, path in ipairs(controllers) do
local modname = "luci.controller." .. path:sub(#base+1, #path-4):gsub("/", ".")
local mod = require(modname)
assert(mod ~= true,
"Invalid controller file found\n" ..
"The file '" .. path .. "' contains an invalid module line.\n" ..
"Please verify whether the module name is set to '" .. modname ..
"' - It must correspond to the file path!")
local idx = mod.index
assert(type(idx) == "function",
"Invalid controller file found\n" ..
"The file '" .. path .. "' contains no index() function.\n" ..
"Please make sure that the controller contains a valid " ..
"index function and verify the spelling!")
index[modname] = idx
end
Требуются модули в правильном порядке (если я печатаю modname внутри цикла):
luci.controller.firewall
luci.controller.opkg
luci.controller.admin.filebrowser
luci.controller.admin.index
luci.controller.admin.network
luci.controller.admin.status
luci.controller.admin.system
luci.controller.admin.uci
luci.controller.myapp.mymodule
но он устанавливает таблицу index , используя строки для ключей (например, "luci.controller.admin.index").
ПРОБЛЕМА Если я напечатаю индексную таблицу в цикле, это будет результат:
1: {"luci.controller.firewall":null}
2: {"luci.controller.firewall":null,"luci.controller.opkg":null}
3: {"luci.controller.firewall":null,"luci.controller.admin.filebrowser":null,"luci.controller.opkg":null}
4: {"luci.controller.firewall":null,"luci.controller.admin.index":null,"luci.controller.admin.filebrowser":null,"luci.controller.opkg":null}
5: {"luci.controller.firewall":null,"luci.controller.admin.index":null,"luci.controller.opkg":null,"luci.controller.admin.filebrowser":null,"luci.controller.admin.network":null}
6: {"luci.controller.firewall":null,"luci.controller.admin.index":null,"luci.controller.opkg":null,"luci.controller.admin.status":null,"luci.controller.admin.filebrowser":null,"luci.controller.admin.network":null}
7: {"luci.controller.firewall":null,"luci.controller.admin.index":null,"luci.controller.opkg":null,"luci.controller.admin.status":null,"luci.controller.admin.system":null,"luci.controller.admin.filebrowser":null,"luci.controller.admin.network":null}
8: {"luci.controller.firewall":null,"luci.controller.admin.index":null,"luci.controller.admin.uci":null,"luci.controller.opkg":null,"luci.controller.admin.status":null,"luci.controller.admin.system":null,"luci.controller.admin.filebrowser":null,"luci.controller.admin.network":null}
9: {"luci.controller.admin.uci":null,"luci.controller.admin.system":null,"luci.controller.myapp.mymodule":null,"luci.controller.firewall":null,"luci.controller.admin.index":null,"luci.controller.admin.network":null,"luci.controller.opkg":null,"luci.controller.admin.filebrowser":null,"luci.controller.admin.status":null}
Почему ??Почему он это делает?
Я хочу вставить mymodule на последнюю позицию, но я бы не стал менять dispatcher.lua (я ожидаю, что он поддерживаетпорядок вставки)
** * ОБНОВЛЕНИЕ * **
Я обнаружил, что если я изменю имя на mymodule и переместу его в нужную папку(например, luci.controller.admin.test или luci.controller.aa), мой модуль будет загружен последним.
Это escamotage, но я хотел бы знать, какие критерии использует Lua