0
lua_State*  m_state;
luaL_newmetatable(m_state,LUA_DATACLIENT);

lua_pushcfunction(m_state,DataClient_Index);
lua_setfield(m_state,-2,"__index");

lua_pushcfunction(m_state,DataClient_newIndex);
lua_setfield(m_state,-2,"__newindex");

lua_pushcfunction(m_state,DataClient_RequestData);
lua_setfield(m_state,-2,"RequestData");

lua_pushcfunction(m_state,DataClient_free);
lua_setfield(m_state,-2,"__gc");
lua_pop(m_state,1);

一部の C 関数を Lua にエクスポートしたいのですが、 Lua でDataClient_Index呼び出したときにその関数が呼び出されたのにRequestData、Lua で特別なメソッドではなくインデックス メソッドを使用するのはなぜですか?

4

1 に答える 1

1

インデックス作成操作を実行するとき、 Lua はデフォルトでメタテーブルを検索しません。

  • テーブルの場合、メタメソッドはインデックスが__indexテーブルに存在しない場合にのみトリガーされます。
  • userdataの場合、ユーザーデータ内にキー値を格納する可能性がないため__index、常に呼び出されます。

ユーザーデータ オブジェクトの場合、メソッドをメタテーブル内に配置するのが通例です。ただし、それが機能するためには、__indexメタテーブル フィールドは、メタテーブル自体、またはメタテーブル内のインデックスを見つけようとする関数のいずれかでなければなりません。

最初の解決策 (これが最も単純な解決策) を選択した場合は、次のように記述できます。

lua_State*  m_state;
luaL_newmetatable(m_state,LUA_DATACLIENT);

lua_pushvalue(m_state, -1); // push the metatable
lua_setfield(m_state,-2,"__index"); // __index points to the metatable itself

// ...
于 2012-12-12T06:43:24.860 に答える