首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lua: make模块系统

Lua: make模块系统
EN

Stack Overflow用户
提问于 2013-04-12 07:28:22
回答 3查看 452关注 0票数 2

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

我创建了这个逻辑的原型,它运行得很好。但是,由于我是Lua的新手,我不知道用什么方法来实现这个功能。

现在,我有了下一个文件结构:

aoc (主程序):

代码语言:javascript
复制
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

核心/核心(核心函数加载器):

代码语言:javascript
复制
dofile (aoc_base_path..'core/move')

芯/移动

代码语言:javascript
复制
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

modules/mine/module (模块):

代码语言:javascript
复制
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更改了逻辑

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-12 09:32:51

您可以简化一下aoc

代码语言:javascript
复制
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) 
票数 1
EN

Stack Overflow用户

发布于 2013-04-12 12:18:07

只需在require中使用Lua的内置模块功能即可。有了适当的package.loaders设置,您可以将这个标准系统配置为从任何您想要的地方以任何方式加载模块。特定的目录,直接从HTTP,由鸽子根据RFC 1149交付-它可以做到这一切。

票数 0
EN

Stack Overflow用户

发布于 2013-04-12 13:09:44

为了保持目录结构大致相同,但使用lua包系统,您可以使用如下方法:

在基本路径中有一个文件aoc.lua

代码语言:javascript
复制
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.luarequire是您想要包含的核心包。

代码语言:javascript
复制
require"core.move"

然后,您的核心包将如下所示:

代码语言:javascript
复制
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看起来如下:

代码语言:javascript
复制
local aoc = require"aoc"

aoc.move()

然后在lua提示符下写:

lua>需要“path.to.aoc”

lua>需要“核心”--加载核心模块

lua>要求“地雷”--装载地雷

编辑

如果要保持相同的样式,请将aoc.lua更改为仅为return {},并按以下方式添加文件aoc:

代码语言:javascript
复制
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包约定。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15965513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档