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

时间:2010-09-27 18:14:13

标签: lua

现在很多游戏都提供了一些lua脚本,但这是普遍没有文档的。

所以让我说我可以运行一个游戏来运行我的lua脚本(它是lua 5.1) - 并且脚本可以将它找到的内容写入磁盘上的文本文件。我可以发现脚本执行的环境有多少?

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

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

2 个答案:

答案 0 :(得分:1)

不幸的是,你无法了解Lua中的功能 - 它们通过设计接受任意数量的参数。如果没有能力查看来源,您唯一的选择就是文档和/或其他样本。

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

“一个错误通常导致桌面崩溃”是一个非常糟糕的设计的标志 - 好的API应该告诉你,它期望A,你通过B.例如在Lqt中,一个Qt绑定对于Lua,我们针对原始Qt API检查每个参数,以便程序员收到错误通知:

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

答案 1 :(得分:1)

“debug”标准库有一些功能,你可能会发现它们很有用:

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

Lua参考手册还指出:

  

其中一些函数违反了一些关于Lua代码的假设(例如,函数本地的变量无法从外部访问,或者用户数据元表无法通过Lua代码更改),因此可能会损害其他安全代码。

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