从lua中的dofile回调主文件

时间:2012-07-03 21:15:09

标签: lua

说我有两个文件:

一个名为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())但它仍然没有被调用

3 个答案:

答案 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

最诚挚的问候    ķ。