2

我想创建一个程序,它在不同的文件夹中有几个模块。主程序将确定需要加载哪个模块并将其加载。除此之外,它还会加载一些核心功能。

我创建了这个逻辑的原型,效果很好。但由于我是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()
end

模块/矿井/模块(模块):

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 mine

工作正常。但是,如果我做错了什么,谁能指出我?

编辑:通过获取改变逻辑aoc_base_path

4

3 回答 3

1

你可以稍微简化一下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-12T09:32:51.100 回答
0

只需将 Lua 的库内置模块功能与require. 通过适当的设置,package.loaders您可以配置此标准系统以从您想要的任何地方以任何您想要的方式加载模块。特定目录,直接来自 HTTP,由鸽子根据 RFC 1149 交付 - 它可以做到这一切。

于 2013-04-12T12:18:07.070 回答
0

为了使您的目录结构或多或少相同,但使用 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 文件来使事情变得更简单,因此 /modules/mine.lua 看起来像:

local aoc = require"aoc"

aoc.move()

然后在 lua 提示符下你会写:

lua> 需要“path.to.aoc”

lua> require"core" --加载核心模块

lua> require"mine" -- 加载我的

编辑

如果你想保持相同的风格,将aoc.lua更改为justreturn {}并添加一个文件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 包约定。

于 2013-04-12T13:09:44.217 回答