如何在已知地址的情况下获取表格的行数

local a = {'1'}
b = {'2'}
print('--------a:', a)   --------a: table: 002411A0
print('--------b:', b)   --------b: table: 005BC470

我该如何获取像这样的结果:a.lua:1 在表格a中或者是 a.lua:2 在表格b中,在已知表格地址为(002411A0)的情况下 我的Lua环境是Lua5.1,我不知道是否需要阅读Lua5.1的源代码或者编译代码?

点赞
用户1442917
用户1442917

无法通过地址获取定义表格的行(因为源代码行和内存地址没有任何关系)。您可以解析脚本的源代码并找到表的定义位置,但我不确定它对您有什么用处。也许您可以描述一下您要做什么?

如果您确实想要找到表的定义位置,可以使用类似 metalua 的工具,构建代码片段的抽象语法树(AST),然后遍历以查找特定表的定义位置。

另一种选择是解析 luac 编译器的输出,这将允许您找到特定表的 NEWMETABLE 命令所在的行号。

2020-12-27 06:18:17
用户6632736
用户6632736

如果你愿意用一个辅助函数来声明你的表,比如叫 logger,那么你就能达到你的目标。

这个思路是在一个虚拟表字段 __line 中记录行数。在下面的例子中,我使用了 __index 元方法来实现,但你也可以直接添加一个字段到创建的表中。

行数是通过 debug.getinfo(2).currentline 获得的。在我的例子中,2 的选择取决于调用栈的深度。

local function logged (t)
    local line = debug.getinfo (2).currentline
    return setmetatable (t, {
        __index = function (_, key)
            if key == '__line' then
                return line
            end
        end
    })
end

local a = logged {'1'}
print (a.__line)    -- 12
b = logged {'2'}
print (b.__line)    -- 14
2020-12-27 11:31:49