如何发现 lua 环境中可用的内容?


How to discover what is available in lua environment?

现在许多游戏都提供了一些 lua 脚本,但这普遍没有记录。

假设我可以得到一个游戏来运行我的 lua 脚本(它是 lua 5.1)——并且该脚本可以将它找到的内容写入磁盘上的文本文件。关于脚本执行的环境,我能发现多少?

例如,我似乎可以列出表中的键,并找出什么是函数以及什么是其他类型的对象,但是没有明显的方法来猜测函数需要多少参数(以及一个错误通常会导致桌面崩溃)。

大多数语言都提供了一些可以在这里使用的反射功能——在嵌入式 lua 环境中可以使用多少?


"调试"标准库有一些功能,您可能会发现它们很有用:

  • debug.getfenv - 返回对象的环境。
  • debug.getinfo - 返回一个包含函数信息的表。
  • ... 和更多

Lua 参考手册还指出:

several of these functions violate some assumptions about Lua code (e.g., that variables local to a function cannot be accessed from outside or that userdata metatables cannot be changed by Lua code) and therefore can compromise otherwise secure code.

所以使用调试库,您可以访问更多。


不幸的是,关于 Lua 中的函数,你可以学到的东西不多——它们在设计上接受任意数量的参数。如果无法查看源代码,您唯一的选择就是文档和/或其他示例。

在这种情况下,您最多可以做的是递归遍历整个 _G 表并转储每个表/函数,将结果打印到文件中。

"一个错误通常会导致桌面崩溃"是一个非常糟糕的设计的标志 - 好的 API 应该告诉你,它需要 A,而你传递了 B。例如在 Lqt 中,Qt 绑定到 Lua,我们对照原始 Qt API 检查每个参数,以便程序员收到错误通知:

1
2
> QApplication.setFont(1, 2)
QApplication::setFont(number, number): incorrect or extra arguments, expecting: QFont*,string,.