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的变量是a2b3x4是另一个a。在getlocal被调用的那一点,c已经超出了范围,namevalue都不在范围内。(记住:局部变量仅仅在他们被初始化之后才可见)也可以使用debug.setlocal修改一个局部变量的值,他的前两个参数是栈级别和变量索引,第三个参数是变量的新值。这个函数返回一个变量名或者nil(如果变量索引超出范围)


相关链接:
lua程序设计目录 - 中国lua开发者 - lua论坛