为什么在Lua中使用索引方法而不是特殊方法

时间:2012-12-11 08:44:43

标签: c lua

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中使用索引方法而不是特殊方法?

1 个答案:

答案 0 :(得分:1)

执行索引操作时,Lua在metatable中看起来不是默认

  • for tables __index metamethod仅在表中不存在索引时触发。
  • 对于 userdata __index 始终被调用,因为无法在用户数据中存储键值。

对于 userdata对象,习惯上将方法放在metatable中。但要使其工作,__index metatable字段应该是metatable本身,或者是一个试图在metatable中找到索引的函数。

如果您选择第一个解决方案(这个最简单的方法),您可以编写如下内容:

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

// ...