2017-04-11 10 views
1

Lua APIには、値が1の場合はメタ機能付きのテーブルをフェッチする関数lua_getmetatableがあります。
(ルアAPIの一部である)Lua補助ライブラリには、別の関数luaL_getmetatableがあります。これは、LUA_REGISTRYINDEXから値を取得します。 しかし、このライブラリluaL_getmetafieldの別の機能は、あなたが期待するものではありません。get_metatableの場所にあるメソッドを探します。lua_getmetatableとluaL_getmetatableの違い

なぜ2つの異なる場所がありますか? 各メタデータはいつ使用されますか?

答えて

4

lua_getmetatableは、指定されたオブジェクトに関連付けられたメタテーブルを取得します。これは基本的な機能です。この関数が存在しない場合、指定されたオブジェクトのメタテーブルにアクセスする方法はありません。

luaL_getmetatableは、userdata(LuaからアクセスできるCオブジェクト)またはテーブルのクラスに型を与えるための規約の一部です。この規約では、luaL_newmetatableでレジストリにテーブルを追加し、これらのテーブルを使用して異なるユーザーデータ/テーブルタイプのメタテーブルを表します(レジストリから読み込み、luaL_setmetatableで設定する必要がある場合)。

これは便利な機能です。あなたがしたくない場合は、このコンベンションに従う必要はありません。レジストリにないメタデータテーブルをどこかに置き、lua_setmetatableというユーザーデータにバインドすると、すべてが機能します。つまり、luaL_*metatable関数が存在しない場合、異なるユーザーデータ/テーブル型を表すために使用していたテーブルをどこに置くか。もう一度それらを必要としたときに、それらを再び見つける方法はありますか?別の方法でこの問題を解決することは間違いありませんが、あらかじめ作成された規約を使用すると効果的です。

関連する問題