0

私が2つのファイルを持っているとしましょう:

1つは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()

もう1つは、libsフォルダーにあるcaller.luaと呼ばれます。

function doCallback()
    print "performing call back"
    _G["callBack"]()
end

最初のファイルを実行した場合の出力は次のとおりです。

"performing call back"

それから何も、私は行が欠けています!

callBackが実行されないのはなぜですか?これは意図された動作ですか、それを回避するにはどうすればよいですか?

関数が文字列から呼び出されているという事実は重要なので、変更することはできません。

更新:私はそれをさらにテストしました、そして_G ["callBack"]は関数(type())に解決しますが、それでも呼び出されません

4

3 に答える 3

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などの他のオペレーティングシステムは使用しません。

string.find私の場合、Linuxでスクリプトを実行すると、インデックスではなく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')
于 2012-07-04T00:06:24.483 に答える
1

1つのディレクトリに戻ることができるようにしたいだけの場合は、ローダーを変更することもできます

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

したがって、次のようにしてファイルを実行できます。

require("caller")
于 2012-07-04T08:55:35.033 に答える
-1

dofile"../Untitled/SensorLib.lua"--バックパスライブラリを使用

よろしくK。

于 2015-11-16T22:25:07.820 に答える