【问题标题】:Lua - C++ object metatable returns nilLua - C++ 对象元表返回 nil
【发布时间】:2021-07-15 02:19:38
【问题描述】:

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

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

-- example usage elsewhere in the scripts:
local pPlayer = GameLib.GetLocalPlayer();

-- my tried code:
local mt = getmetatable(GameLib);
print("Metatable type:" .. type(mt)); -- "Metatable type: nil"

可能是什么问题?是否存在 C++ 对象没有元表的情况?如果是这样,还有其他方法可以访问其属性吗?

【问题讨论】:

  • 函数 getmetatable 可能会被重新定义以故意对您隐藏元表(您创建的元表除外)。
  • 你确定GameLib 不只是一张普通的旧桌子吗?你在什么游戏中使用 Lua?
  • @EgorSkriptunoff 与仅使用 __metatable(不会让您返回 nil)相比,这有多普遍?
  • @JosephSible-ReinstateMonica 你是对的,它确实是一个表,其中函数名是键,并且 - 大多数情况下 - C++ 指针是条目。我不知道可以直接调用函数而无需索引或类似的东西。感谢您的回答!
  • @JosephSible-ReinstateMonica - 有时重新定义一个函数比在 50 个元表中插入额外的字段更容易。

标签: c++ reflection lua metatable


【解决方案1】:

来自 Lua 5.4 参考手册:

2.4 Metatables and Metamethods:

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

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

所以在某些情况下,值,甚至用户数据都没有元表。事实上,这是默认设置。

6.1 Basic Functions: getmetatable

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

所以这给我们留下了两个选择,为什么getmetatable(GameLib) 返回nil

  1. GameLib 没有元表
  2. getmetatable 不是 Lua 的 getmetatable。它已被至少为某些值返回 nil 的函数覆盖。琐碎function getmetatable() end

【讨论】:

  • 感谢您的详尽回答!对于 Lua 如何处理通常是其他业务语言中的对象的结构,我有些困惑。 C++ 导出的对象有可能将它们的数据包含在一个元表中,这似乎是唯一的;然而,实际的对象表示可能是 Lua 表本身的类型,我完全错过了。
猜你喜欢
  • 2017-07-03
  • 1970-01-01
  • 2018-09-16
  • 2018-05-02
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
相关资源
最近更新 更多