4

問題が発生した関数を知らせる lua テスト フレームワークをまとめようとしていますが、loadstring から に切り替えたときに_G(テスト ハーネスが関数呼び出しの結果を確認できるように切り替えました)、関数が使用し始めました。関数名の「nil」

_G次のコードで現在の関数の名前を検出できないのはなぜですか? また、loadstring からの戻り値 (つまり、blah 呼び出しからの「false」) を取得したり、使用時に関数名を設定したりするに_Gはどうすればよいですか (つまり、lua インタープリターに関数名を教えてください)。

function run_test(one, two)
    if one ~= two then
        print(debug.getinfo(2).name..' Failed')
    end
end

function blah()
    run_test(false, true)
    return false
end

local fname = 'blah'
local status, result = pcall(_G[fname])  -- Outputs 'nil'; result is 'false'
local status, result = pcall(loadstring(fname..'()'))  -- Outputs 'blah', result is 'nil'

私が必要とする主なものは、関数名の文字列を使用して関数を呼び出す方法であり、呼び出し内の関数名を確認できるようにすることです (テストの失敗のために、関数の fname = 'blah' のように、失敗した関数を指すようにします)。上記のコード) 戻り値を取得できるようにする

local fname = 'blah'
status, result = pcall(??Call fname somehow??)
assert(status)
assert(not result)

--stdout should be "blah Failed"
4

1 に答える 1

3

これは、Lua が関数に名前を付けるために使用するヒューリスティックの制限です。

Lua では、すべての関数は匿名です。特定の関数は、複数の変数 (グローバル、ローカル、およびテーブル フィールド) の値にすることができます。Lua デバッグ システムは、実行中のバイトコードを調べて、値の由来に基づいて値の適切な名前を見つけようとします。

もっと簡単な例を考えてみましょう

blah()
pcall(blah)

最初の呼び出しで、デバッグ システムは、呼び出されている関数がグローバルから来ていることを認識しblahdebug.getinfo(1).name期待される結果blah.

2 番目の呼び出しでは、デバッグ システムは、呼び出されている関数が最初の引数 からpcall来ていることを認識しますが、その引数がどこから来たのかをさらに調べず、 をdebug.getinfo(1).name返しますnil

を呼び出すときも同じことが起こります_G[name]()。デバッグ システムが認識するのはテーブルのフィールドだけであり、フィールドの名前があまりにもかけ離れています。

この説明の別の見方を確認するにprint(debug.traceback())は、最初の行としてを追加してみてください。blah

于 2013-08-29T00:15:05.607 に答える