11

ここで基本に戻りますが、Luaでは次のようにテーブルを定義できます。

myTable = {}
myTable [1] = 12

テーブル参照自体を印刷すると、その参照へのポインタが返されます。その要素にアクセスするには、インデックスを指定する必要があります(つまり、配列とまったく同じように)

print(myTable )    --prints pointer
print(myTable[1])  --prints 12

今、関数は別の話です。次のような関数を定義して印刷できます。

myFunc = function() local x = 14 end     --Defined function
print(myFunc)                            --Printed pointer to function

定義された関数の本体にアクセスする方法はありますか?小さなコードビジュアライザーをまとめようとしていますが、特定の関数を特別な関数/変数で「シード」して、ビジュアライザーがコードに「フック」できるようにしたいのですが、関数を次のいずれかから再定義できる必要があります。変数または文字列。

4

4 に答える 4

11

プレーンな Lua で特定の関数の本体ソース コードにアクセスする方法はありません。バイトコードにコンパイルした後、ソースコードは破棄されます。

ところで、関数はロードストリングのような機能を使用して実行時に定義できることに注意してください。

実際に何を達成したいかによっては、部分的な解決策が可能です。

デバッグ ライブラリからソース コードの位置を取得できます — デバッグ ライブラリが有効で、デバッグ シンボルがバイトコードから削除されていない場合。その後、実際のソース ファイルを読み込んで、そこからコードを抽出できます。

必要なメタデータを使用して、関心のある関数を手動で装飾できます。Lua の関数は有効なテーブル キーであるため、関数からメタデータへのテーブルを作成できます。このテーブルを弱いキーにしたいので、関数が GC によって収集されるのを妨げません。

Lua コードを分析するためのソリューションが必要な場合は、Metaluaをご覧ください。

于 2009-02-02T21:35:39.857 に答える
5

デバッグライブラリを使用することが唯一の賭けです。これを使用して、文字列(関数が'loadstring'でロードされたチャンクで定義されている場合)または関数が定義されたファイルの名前のいずれかを取得できます。関数定義が開始および終了する行番号と一緒に。ドキュメントを参照してください。

ここで私の現在の仕事では、Luaにパッチを適用して、関数の開始と終了の列番号も表示されるようにしました。これにより、それを使用して関数ソースを取得できます。パッチの再現はそれほど難しくありませんが、ここに投稿することは許可されないと思います:-(

于 2009-02-04T10:04:22.077 に答える
5

デバッグ ライブラリの Lua Introspective Facilitiesを確認してください。

デバッグ ライブラリの主なイントロスペクティブ関数は、debug.getinfo 関数です。その最初のパラメーターは、関数またはスタック レベルの場合があります。関数 foo に対して debug.getinfo(foo) を呼び出すと、その関数に関するデータを含むテーブルが取得されます。テーブルには次のフィールドが含まれる場合があります。

あなたが望むフィールドは func だと思います。

于 2009-02-02T19:52:18.847 に答える