Lua - C++ 对象 metatable 返回空

我刚开始深入研究 Lua,并了解到可以通过 metatable 访问 C++ 对象的属性。

我正在尝试在游戏脚本中访问此类对象的函数:“GameLib”。它在 Lua 中作为全局变量可用,但 getmetatable() 返回空值:

-- 在脚本的其他地方使用:
local pPlayer = GameLib.GetLocalPlayer();

-- 我尝试的代码:
local mt = getmetatable(GameLib);
print("Metatable 类型:" .. type(mt)); -- "Metatable 类型: nil"

有什么问题吗?是否有某些情况下,C++ 对象没有 metatable?如果有,是否有另一种访问其属性的方式?

点赞
用户2858170
用户2858170

Lua 5.4 参考手册中的 2.4 Metatables 和 Metamethods:

Lua 中的每个值都可以有元表。

默认情况下,一个值没有元表,但字符串库为字符串类型设置了元表。

另外,有些值,甚至包括 userdata,都没有元表。实际上这是默认的情况。

在 6.1 Basic Functions 中,有 getmetatable 函数(https://www.lua.org/manual/5.4/manual.html#pdf-getmetatable):

如果对象没有元表,则返回 nil。否则,如果对象的元表有 __metatable 字段,则返回相关联的值。否则,返回给定对象的元表。

因此,getmetatable(GameLib) 返回 nil 有两种可能:

  1. GameLib 没有元表
  2. getmetatable 不是 Lua 的 getmetatable。有一个函数覆盖了它,对于某些值返回 nil。一个简单的 function getmetatable() end
2021-04-21 08:57:42