lua_getmetatable 与 luaL_getmetatable 有什么区别?

Lua API 中有一个函数 lua_getmetatable,它可以获取带有元函数的表,如果这个值有的话。

Lua 辅助库(是 lua API 的一部分)也有另一个函数 luaL_getmetatable,它是一个从 LUA_REGISTRYINDEX 获取值的宏。 但是,这个库中的另一个函数 luaL_getmetafield 不会按照你希望的方式工作 - 它将在 get_metatable 的位置查找方法。

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

点赞
用户485561
用户485561

lua_getmetatable 函数可以获取与给定对象相关联的元表。这是一个基本特性;如果这个函数不存在,那么就没有办法访问给定对象的元表。

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

这只是一种方便的特性;如果您不想遵循这种约定,也可以不使用。如果您将元数据表放在不在注册表中的其他地方,并使用 lua_setmetatable 将其绑定到您的 userdata 上,一切都仍然可以正常工作。不过,如果 luaL_*metatable 函数不存在,您将把用于表示不同 userdata/表类型的表放在哪里,并在需要时再次找到它们呢?您肯定可以用不同的方式解决这个问题,但如果这个预设约定适合您,为什么不使用它呢?

2017-04-11 23:41:02