说我有两个文件:
一个名为mainFile.lua:
function altDoFile(name)
dofile(debug.getinfo(1).source:sub(debug.getinfo(1).source:find(".*\\")):sub(2)..name)
end
altDoFile("libs/caller.lua")
function callBack()
print "called back"
end
doCallback()
另一个名为caller.lua,位于libs文件夹中:
function doCallback()
print "performing call back"
_G["callBack"]()
end
运行第一个文件的输出是:
"performing call back"
然后没有了,我错过了一条线!
为什么callBack永远不会被执行?这是预期的行为,我该如何解决它?
函数从字符串调用的事实很重要,因此无法更改。
更新: 我已经进一步测试了,_G [“callBack”]确实解析为一个函数(type())但它仍然没有被调用
答案 0 :(得分:1)
为什么不使用dofile?
似乎altDoFile
的目的是用您要调用的脚本替换正在运行的脚本的文件名,从而创建一个绝对路径。在这种情况下,caller.lua
的路径是一个相对路径,因此您不需要为Lua更改任何内容来加载文件。
将代码重构为:
dofile("libs/caller.lua")
function callBack()
print "called back"
end
doCallback()
似乎给出了您正在寻找的结果:
$ lua mainFile.lua
performing call back
called back
正如旁注,altDoFile
如果路径不包含\
字符则会引发错误。 Windows使用反斜杠作为路径名,但其他操作系统(如Linux和MacOS)则不然。
在我的情况下,在Linux上运行脚本会引发错误,因为string.find
返回nill而不是索引。
lua: mainFile.lua:2: bad argument #1 to 'sub' (number expected, got nil)
如果您需要知道主脚本的工作路径,为什么不将它作为命令行参数传递:
C:\LuaFiles> lua mainFile.lua C:/LuaFiles
然后在Lua:
local working_path = arg[1] or '.'
dofile(working_path..'/libs/caller.lua')
答案 1 :(得分:1)
如果您只想回到一个目录,也可以修改加载程序
package.path = ";../?.lua" .. package.path;
那么你可以通过执行以下操作来运行文件:
require("caller")
答案 2 :(得分:-1)
dofile“../Untitled/SensorLib.lua” - 使用backpath librarys
最诚挚的问候 ķ。