Roc*_*etR 34 lua require coronasdk
如果我有这样的文件结构:
./main.lua
./mylib/mylib.lua
./mylib/mylib-utils.lua
./mylib/mylib-helpers.lua
./mylib/mylib-other-stuff.lua
Run Code Online (Sandbox Code Playgroud)
从main.lua文件mylib.lua中可以加载完整路径require('mylib.mylib').但在内部mylib.lua我还想加载其他必要的模块,我不想总是指定完整的路径(例如mylib.mylib-utils).如果我决定移动文件夹,我将有很多搜索和替换.有没有办法只使用路径的相对部分?
UPD.我正在使用Lua和Corona SDK,如果这很重要的话.
kik*_*ito 34
有一种方法可以推断出文件的"本地路径"(更具体地说,是用于加载文件的字符串).
如果你需要一个文件lib.foo.bar,你可能会这样做:
require 'lib.foo.bar'
Run Code Online (Sandbox Code Playgroud)
然后...,当您在所有函数之外时,可以将文件的路径作为第一个元素(也是唯一的)变量.换一种说法:
-- lib/foo/bar.lua
local pathOfThisFile = ... -- pathOfThisFile is now 'lib.foo.bar'
Run Code Online (Sandbox Code Playgroud)
现在,要获取"文件夹",您需要删除文件名.最简单的方法是使用匹配:
local folderOfThisFile = (...):match("(.-)[^%.]+$") -- returns 'lib.foo.'
Run Code Online (Sandbox Code Playgroud)
你有它.现在,您可以将该字符串添加到其他文件名,并使用它来要求:
require(folderOfThisFile .. 'baz') -- require('lib.foo.baz')
require(folderOfThisFile .. 'bazinga') -- require('lib.foo.bazinga')
Run Code Online (Sandbox Code Playgroud)
如果你四处bar.lua走动,folderOfThisFile会自动更新.
Set*_*gie 16
你可以做
package.path = './mylib/?.lua;' .. package.path
Run Code Online (Sandbox Code Playgroud)
要么
local oldreq = require
local require = function(s) return oldreq('mylib.' .. s) end
Run Code Online (Sandbox Code Playgroud)
然后
-- do all the requires
require('mylib-utils')
require('mylib-helpers')
require('mylib-other-stuff')
-- and optionally restore the old require, if you did it the second way
require = oldreq
Run Code Online (Sandbox Code Playgroud)