在Lua

2012-07-03 36 views
0

從dofile處理調用回主文件說我有兩個文件:在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 [「回調」]沒有解決的功能(類型()),但它仍然不會被調用

+0

確定的路徑分隔符是\,而不是'/'? – lhf

+0

好,不,altDoFile功能是什麼我從別人那裏得到了。但該文件確實加載,所以這不是問題 –

+0

@Delusional Logic:「該文件確實加載,所以這不是問題」然後你應該刪除它並重新發布,如果事實證明它*是問題,那麼你已經發現了一個有價值的線索,如果它不是*問題,你已經從你的帖子中刪除了一個複雜的分散注意力。無論哪種方式,將你的代碼減少到再現問題的最小的事情是雙贏的。 – Mud

回答

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') 
+0

我保留了它在那裏,因爲我需要它在我的原始腳本。我已經重新編寫它,而我現在可以工作。謝謝。 –

1

如果您只想能夠走回一個目錄,也可以修改加載器

package.path = ";../?.lua" .. package.path; 

,那麼你可以做你運行文件:

require("caller") 
-1

dofile處理」 ../Untitled/SensorLib。LUA」 - 使用backpath圖書館的

問候 K.

+2

對於已經有答案的東西,這是一個非常晚的答案,似乎沒有在原始答案中添加任何內容。這是另一個答案嗎?如果是這樣,請添加一些上下文來澄清,因爲這是一個非常簡潔的迴應。 –