如何发现Lua环境中提供了什么?

现如今,许多游戏都可以使用一些lua脚本,但是这些脚本普遍没有文档记录。

假设我可以让游戏运行我的lua脚本(它是lua 5.1),而且脚本可以将其找到的内容写入磁盘上的文本文件。我可以发现脚本正在执行的环境有多少信息呢?

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

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

原文链接 https://stackoverflow.com/questions/3806593

点赞
stackoverflow用户221509
stackoverflow用户221509

不幸的是,在Lua中你无法学到很多关于函数的知识——因为它们被设计成可以接受任意数量的参数。如果不能查看源代码,你唯一的选择就是文档或其他示例。

在这种情况下,你能做的最多的就是递归地遍历整个_G表并转储每一个表和函数,将结果打印到一个文件中。

“错误通常会导致桌面崩溃”是一个设计非常糟糕的迹象——好的API应该告诉你,它期望A,而你传递了B。例如,在Lqt中,一个Qt绑定到Lua,我们检查每个参数是否符合原始的Qt API,这样程序员就会被通知到错误:

> QApplication.setFont(1, 2)
QApplication::setFont(number,number):不正确或多余的参数,期望:QFont*,string,。
2010-09-27 20:16:42
stackoverflow用户457630
stackoverflow用户457630

"debug"标准库有一些你可能会发现有用的函数:

-debug.getfenv - 返回对象环境。 -debug.getinfo - 返回一个有关函数信息的表。 -...等等

Lua参考手册也指出:

其中几个函数违反了Lua代码的一些假设(例如,函数内部的本地变量不能从外部访问,或者Lua代码不能更改userdata元表),因此可能会危及本来安全的代码。

因此,使用debug库,你可以访问更多的内容。

2010-09-27 21:52:39