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,但是DataClient_Index当我在Lua中调用时调用了该函数RequestData,那么为什么在Lua中使用索引方法而不是特殊方法?

4

1 回答 1

1

Lua在执行索引操作时默认不查看元表。

  • 对于__index只有在表中不存在索引时才会触发元方法。
  • 对于userdata__index总是调用,因为不可能在 userdata 中存储键值

对于userdata 对象,习惯上将方法放在元表中。然而,为了使其工作,__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 回答