代码之家  ›  专栏  ›  技术社区  ›  Dalin Seivewright

使用Lua访问函数体

  •  9
  • Dalin Seivewright  · 技术社区  · 16 年前

    myTable = {}
    myTable [1] = 12
    

    打印表引用本身会返回指向它的指针。要访问其元素,您需要指定一个索引(即,与数组完全相同)

    print(myTable )    --prints pointer
    print(myTable[1])  --prints 12
    

    现在,函数是另一回事了。您可以这样定义和打印函数:

    myFunc = function() local x = 14 end     --Defined function
    print(myFunc)                            --Printed pointer to function
    

    4 回复  |  直到 16 年前
        1
  •  12
  •   Alexander Gladysh    16 年前

    在普通Lua中,无法访问给定函数的主体源代码。源代码在编译成字节码后被丢弃。

    请注意,可以使用类似loadstring的工具在运行时定义函数。

    部分解决方案是可能的——取决于您实际想要实现的目标。

    您可以使用所需的元数据手动装饰感兴趣的函数。请注意,Lua中的函数是有效的表键,所以您可以创建一个用于元数据表的函数。您可能希望将此表设置为弱键控,这样就不会阻止GC收集函数。

    Metalua .

        2
  •  4
  •   Jan de Vos    16 年前

    使用调试库是您唯一的选择。使用它,您可以获取字符串(如果函数是在使用“loadstring”加载的块中定义的)或定义函数的文件名;以及函数定义开始和结束的行号。见 documentation

        3
  •  3
  •   Nick Van Brunt    16 年前

    退房 Lua Introspective Facilities 在调试库中。

    自我反省的主要功能 函数或堆栈级别。当你 调用debug.getinfo(foo)获取一些 关于该函数的一些数据。这个 表可能包含以下字段:

    我想你想要的是func。

        4
  •  0
  •   Judge Maygarden    16 年前

    您可以通过创建 environment setfenv )以及使用全局(相对于局部)变量。在函数中创建的变量将在函数执行后出现在环境表中。

    env = {}
    myFunc = function() x = 14 end
    setfenv(myFunc, env)
    myFunc()
    print(myFunc)    -- prints pointer
    print(env.x)     -- prints 14
    

    Debug Library :

    > myFunc = function() local x = 14 ; debug.debug() end
    > myFunc()
    > lua_debug> _, x = debug.getlocal(3, 1)
    > lua_debug> print(x) -- prints 14
    

    hook function 而不是显式进入调试模式(即添加debug.debug()调用)

    还有一个 Debug Interface 在luaapi中。