lua_getmetatable 和 luaL_getmetatable 有什么区别

tei*_*vaz 1 lua lua-api metatable

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

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

Man*_*rse 5

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

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

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