lua_getmetatable和luaL_getmetatable有什么区别

时间:2017-04-11 23:01:44

标签: lua lua-api metatable

Lua API有一个函数lua_getmetatable,如果值为1,它将获取带有元函数的表。
Lua辅助库(它是lua API的一部分)具有另一个函数luaL_getmetatable,它是一个从LUA_REGISTRYINDEX获取值的宏。 但是这个库luaL_getmetafield中的另一个函数并不是你期望它做的 - 它将在get_metatable的位置寻找一个方法。

为什么有两个不同的位置? 什么时候使用metatable?

1 个答案:

答案 0 :(得分:4)

lua_getmetatable获取与给定对象关联的元表。这是一个基本特征;如果此函数不存在,则无法访问给定对象的元表。

luaL_getmetatable是向userdata(可以从Lua访问的C对象)或表类提供类型的约定的一部分。在此约定中,您使用luaL_newmetatable将表添加到注册表,然后使用这些表来表示不同userdata /表类型的元表(当您需要它们时,您可以从注册表中读取它们并使用{{1 }})。

这只是一个便利功能;如果你不想,你不需要遵循这个惯例。如果您将元数据表放在注册表中的某个位置并使用luaL_setmetatable将它们绑定到您的用户数据,那么一切仍然有效。也就是说,如果lua_setmetatable函数不存在,那么您将把用于表示不同用户数据/表类型的表放在哪里;当你第二次需要它们时,你会怎样再找到它们?你绝对可以用不同的方式解决这个问题,但为什么不使用预先构建的约定,如果它适合你。