如果我有这样的文件结构:
./main.lua ./mylib/mylib.lua ./mylib/mylib-utils.lua ./mylib/mylib-helpers.lua ./mylib/mylib-other-stuff.lua
从main.lua文件mylib.lua可以加载完整路径require(‘mylib.mylib’)。但是在mylib.lua里面,我也想加载其他必要的模块,我不觉得总是指定完整路径(例如mylib.mylib-utils)。如果我决定移动文件夹,我将有大量的搜索和替换。有没有办法只使用路径的相对部分?
UPD)。我正在使用Lua与Corona SDK,如果重要。
解决方法
有一种推断文件的“本地路径”的方法(更具体地说,是用于加载文件的字符串)。
如果您需要lib.foo.bar中的文件,您可能会这样做:
require 'lib.foo.bar'
然后,当您处于所有功能之外时,您可以获取文件的路径作为第一个元素(而且仅)…变量。换一种说法:
-- lib/foo/bar.lua local pathOfThisFile = ... -- pathOfThisFile is now 'lib.foo.bar'
现在,要获取“文件夹”,您需要删除文件名。最简单的方法是使用匹配:
local folderOfThisFile = (...):match("(.-)[^%.]+$") -- returns 'lib.foo.'
在那里你有它现在,您可以将该字符串添加到其他文件名,并使用它来要求:
require(folderOfThisFile .. 'baz') -- require('lib.foo.baz') require(folderOfThisFile .. 'bazinga') -- require('lib.foo.bazinga')
如果您移动bar.lua,folderOfThisFile将自动更新。