第一版是针对 Lua 5.0 编写的。虽然在很大程度上仍然适用于后续版本,但存在一些差异。
第四版针对 Lua 5.3,可在 Amazon 和其他书店购买。
购买本书,您还可以帮助 支持 Lua 项目


23.1.1 – 访问局部变量

您可以通过调用 debug 库中的 getlocal 来访问任何活动函数的局部变量。它有两个参数:正在查询的函数的堆栈级别和变量索引。它返回两个值:该变量的名称和当前值。如果变量索引大于活动变量的数量,getlocal 返回 nil。如果堆栈级别无效,它会引发错误。(您可以使用 debug.getinfo 来检查堆栈级别的有效性。)

Lua 按局部变量在函数中出现的顺序对局部变量进行编号,仅计算函数当前作用域中处于活动状态的变量。例如,代码

    function foo (a,b)
      local x
      do local c = a - b end
      local a = 1
      while true do
        local name, value = debug.getlocal(1, a)
        if not name then break end
        print(name, value)
        a = a + 1
      end
    end
    
    foo(10, 20)
将打印
    a       10
    b       20
    x       nil
    a       4
索引为 1 的变量是 a(第一个参数),2 是 b,3 是 x,4 是另一个 a。在调用 getlocal 的位置,c 已超出作用域,而 namevalue 尚未进入作用域。(请记住,局部变量仅在其初始化代码之后才可见。)

您还可以使用 debug.setlocal 更改局部变量的值。它的前两个参数是堆栈级别和变量索引,如在 getlocal 中一样。它的第三个参数是该变量的新值。它返回变量名称,如果变量索引超出作用域,则返回 nil