如何在 Lua 中构建一个独立的模块?

Lla*_*don 4 lua module require

我正在为 Love2D 制作一个 Lua 库,其中包含相当多的内部子模块、类文件等。

我现在正在做的事情看起来像这样:

文件./libname/init.lua
lib.prefix = (...):match("(.-)[^%.]+$") .. "libname."
lib = {}

lib.class = require(lib.prefix .. "lib.class")
lib.types.Blah = require(lib.prefix .. "types.Blah")

return lib
Run Code Online (Sandbox Code Playgroud) 文件./libname/types/Blah.lua
local Blah = lib.class()
...
return Blah
Run Code Online (Sandbox Code Playgroud)

除了这里的事情是 lib 是全局的,如果我将其变成本地的,我无法正确构建像 之类的子模块Blah,因为它们不再有权访问该lib表。

这显然是一个精简的示例,但我认为它很好地说明了我的问题 - 我想将表设置为本lib地表并返回它,以便包含库就像lib = require "libs.libname",而不是将整个内容导入到全局范围中当我需要模块本身时。是否可以?

kik*_*ito 5

我为这个概念制作了一个指南。你可以在这里找到它:

http://kiki.to/blog/2014/03/30/a-guide-to-authoring-lua-modules/

为了解决您在问题中提到的具体问题,我将使用 3 个文件:core.lua共享状态、更改核心的“真实文件”以及init将所有内容联系起来。

./libname/core.lualib被定义为局部条的地方。它没有定义lib.types. 它使用其他文件可能想要使用的实用程序“奠定基础”,例如设置前缀或实用程序class

local lib = {}

lib.prefix = (...):match("(.-)[^%.]+$") .. "libname."

lib.class = require(lib.prefix .. "lib.class")

return lib
Run Code Online (Sandbox Code Playgroud)

“常规文件”,例如./libname/types/Blah.lua,使用这些实用程序,但根本不修改 lib:

local lib = require 'core' -- or libname.core or using the current_folder trick

local Blah = lib.class()
...
return Blah
Run Code Online (Sandbox Code Playgroud)

init.lua将所有内容绑定在一起:

local lib = require 'core' -- or libname.core or current_folder trick

lib.types.Blah = require(lib.prefix .. "types.Blah")

return lib
Run Code Online (Sandbox Code Playgroud)

评论中提到的“当前文件夹技巧”在这里:http://kiki.to/blog/2014/04/12/rule-5-beware-of-multiple-files/#the-current_folder-trick