我想要创建一个程序,它将在不同的文件夹中有几个模块。主程序将确定需要加载哪个模块并将其加载。此外,它还将加载一些核心功能。
我创建了这个逻辑的原型,它运行得很好。但是,由于我是Lua的新手,我不知道用什么方法来实现这个功能。
现在,我有了下一个文件结构:

aoc (主程序):
aoc = {}
aoc_base_path = debug.getinfo(1).source:match("@(.*)/.*$") -- base path to my program
if not aoc_base_path then
aoc_base_path = ''
else
aoc_base_path = aoc_base_path..'/'
end
local aoc_base_arg={...}
dofile(aoc_base_path.."core/core")
local module = assert(loadfile(aoc_base_path.."modules/"..aoc_base_arg[1].."/module"))
local arg = table.copy(aoc_base_arg) -- this is my custom function (I'm not provide you with listing, it just copy one table to another one
table.remove(arg,1)
module(arg,aoc) -- pass to module all arguments except first one核心/核心(核心函数加载器):
dofile (aoc_base_path..'core/move')芯/移动
local function move(direction, refuel, dig, attack)
-- some logic in local function (to not be overwriten in module)
end
function aoc.move()
-- global function (it logic can be changed by module in case it needed)
return move()
endmodules/mine/module (模块):
local arg={...} -- I passed 2 arguments in aoc main program
arg = arg[1]
local aoc = arg[2]
aoc.move()现在
lua> aoc地雷
或
lua> path/to/aoc地雷
工作还行。但如果我做错了什么谁能指点我吗?
编辑:通过获取aoc_base_path更改了逻辑
发布于 2013-04-12 09:32:51
您可以简化一下aoc:
aoc = {}
aoc_base_path = debug.getinfo(1).source:match("@(.*/)") or ''
dofile(aoc_base_path.."core/core")
local module = assert(loadfile(aoc_base_path.."modules/".. ... .."/module"))
module({select(2,...)},aoc) 发布于 2013-04-12 12:18:07
只需在require中使用Lua的内置模块功能即可。有了适当的package.loaders设置,您可以将这个标准系统配置为从任何您想要的地方以任何方式加载模块。特定的目录,直接从HTTP,由鸽子根据RFC 1149交付-它可以做到这一切。
发布于 2013-04-12 13:09:44
为了保持目录结构大致相同,但使用lua包系统,您可以使用如下方法:
在基本路径中有一个文件aoc.lua
local aoc = {}
local module = ...
local dir = module:gsub("%.","%/"):sub(1,-4)
package.path = dir.."?.lua;"..package.path
package.path = dir.."?/init.lua;"..package.path
package.path = dir.."modules/?.lua;"..package.path
return aoc在/core中有一个文件init.lua,require是您想要包含的核心包。
require"core.move"然后,您的核心包将如下所示:
local function move(direction, refuel, dig, attack)
-- some logic in local function (to not be overwriten in module)
end
require"aoc".move = move在/modules中,您可以通过为每个模块提供一个lua文件来使事情变得简单一些,所以/ module /mine.lua看起来如下:
local aoc = require"aoc"
aoc.move()然后在lua提示符下写:
lua>需要“path.to.aoc”
lua>需要“核心”--加载核心模块
lua>要求“地雷”--装载地雷
编辑
如果要保持相同的样式,请将aoc.lua更改为仅为return {},并按以下方式添加文件aoc:
local dir = debug.getinfo(1).source:match("@(.*)/.*$") -- base path to my program
if not dir then dir = ''
else dir = dir..'/'
end
package.path = dir.."?.lua;"..package.path
package.path = dir.."?/init.lua;"..package.path
package.path = dir.."modules/?.lua;"..package.path
require"core"
for _,mod in ipairs{...} do
require(mod)
end我建议这种方法的优点是,所有的损坏都在一个文件中,在本例中是aoc,其余的文件结构使用相当标准的lua包约定。
https://stackoverflow.com/questions/15965513
复制相似问题