Lua API有一个函数lua_getmetatable
,如果值为1,它将获取带有元函数的表。
Lua辅助库(它是lua API的一部分)具有另一个函数luaL_getmetatable
,它是一个从LUA_REGISTRYINDEX
获取值的宏。
但是这个库luaL_getmetafield
中的另一个函数并不是你期望它做的 - 它将在get_metatable
的位置寻找一个方法。
为什么有两个不同的位置? 什么时候使用metatable?
答案 0 :(得分:4)
lua_getmetatable
获取与给定对象关联的元表。这是一个基本特征;如果此函数不存在,则无法访问给定对象的元表。
luaL_getmetatable
是向userdata(可以从Lua访问的C对象)或表类提供类型的约定的一部分。在此约定中,您使用luaL_newmetatable
将表添加到注册表,然后使用这些表来表示不同userdata /表类型的元表(当您需要它们时,您可以从注册表中读取它们并使用{{1 }})。
这只是一个便利功能;如果你不想,你不需要遵循这个惯例。如果您将元数据表放在注册表中的某个位置并使用luaL_setmetatable
将它们绑定到您的用户数据,那么一切仍然有效。也就是说,如果lua_setmetatable
函数不存在,那么您将把用于表示不同用户数据/表类型的表放在哪里;当你第二次需要它们时,你会怎样再找到它们?你绝对可以用不同的方式解决这个问题,但为什么不使用预先构建的约定,如果它适合你。