0

Luaの初心者として、これに関する答えが簡単でしたら申し訳ありません. コード内で関数を呼び出そうとしましたが、2 時間検索しても目的の結果が見つかりませんでした。(たぶん、間違った検索クエリを使用していますか?)

サンプルコード

function Test123 ()    
    SayTest = True
    if SayTest = True then
        -- This Is where I want to call the function name Test123, 
        -- yet I can't seem to succeed in this since it is just 
        -- starting a new function
        SystemNotice ( role, function) 
    end
end

これは結果になるはずです:

function Test123 ()    
    SayTest = True
    if SayTest = True then        
        SystemNotice ( role, 'Test123')
    end
end

誰かが私を助けることができれば、私は感謝します. まだ不明な点がある場合は、お知らせください。より適切に説明できるように努めます。私の限られた英語の言い訳。

4

3 に答える 3

2

Lua では、関数は実際にはです。つまり、実際には名前がなく、変数またはテーブル フィールドに割り当てることしかできませんが、値自体には名前の概念がないため、取得することはできません。

つまり、debugライブラリを使用すると、次のことができます。

function getfname()
    return debug.traceback("", 2):match("in function '(.-)'");
end
function bar()
    print(getfname())
end

bar();             -- prints bar
foo = bar;
foo()              -- prints foo
knerf = {rab = bar};
knerf.rab()        -- prints rab

これは、デフォルトの Lua エラー ハンドラー、または同じか非常に類似した出力を返すエラー ハンドラーでのみ機能することに注意してください。ただし、必要に応じてパターンを変更することはもちろん可能です。

これを読んでください:パフォーマンスを重視するタスクには、このソリューションをお勧めしません。文字列の一致とトレースバックはどちらも、これにはあまり適していません。また、トレースバック機能を実際に使用できるように、明らかにデバッグ ライブラリを有効にする必要があります。

于 2013-10-16T14:39:10.230 に答える
0

これは、関数は第一級市民であるという Lua の哲学に反する構造です。関数は単なる別の値であり、そのため名前はありません。

変数に値を割り当てることができるため、関数を名前にバインドできます。しかし、その名前は変更される可能性があります。または、関数に複数の名前を付けることができます。どれを選ぶ?

より良い解決策は、代わりに上位値 (クロージャー) を持つ無名関数を作成することです。

function genTest(name)
    return function()    
        SayTest = true
        if SayTest == true then        
            print ( 'role', name)
        end
    end
end

Test123 = genTest('Test123')
Test123()
foobar = Test123
foobar()

これにより、バインドされたローカル変数名を持つ関数が作成されます ( PiL 6.1を参照)。

于 2013-10-17T08:09:12.477 に答える