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",而不是将整个内容导入到全局范围中当我需要模块本身时。是否可以?
我为这个概念制作了一个指南。你可以在这里找到它:
http://kiki.to/blog/2014/03/30/a-guide-to-authoring-lua-modules/
为了解决您在问题中提到的具体问题,我将使用 3 个文件:core.lua共享状态、更改核心的“真实文件”以及init将所有内容联系起来。
./libname/core.lua是lib被定义为局部条的地方。它没有定义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