lua_getmetatable 和 luaL_getmetatable 有什么区别

What is the difference between lua_getmetatable and luaL_getmetatable

Lua API 有一个函数 lua_getmetatable 如果值有元函数,它将获取 table 元函数。
Lua 辅助库(它是 lua API 的一部分)有另一个函数 luaL_getmetatable,它是一个宏,可以从 LUA_REGISTRYINDEX 获取一个值。 但是这个库 luaL_getmetafield 中的另一个函数并不像你期望的那样 - 它会在 get_metatable 的位置寻找一个方法。

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

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

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

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