访问局部变量

简介: 访问局部变量

我们可以通过函数 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 还未出现于作用域。


注意

局部变量只在初始化后才可见。


Lua5.2 开始,值为负数的索引获取可变长参数函数的额外参数,索引 -1 指向第一个额外参数。此时,变量的名称永远是 "(*vararg)"


我们还可以通过函数 debug.setlocal 改变局部变量的值,该函数的前两个参数与 getlocal 相同,分别是栈层次变量索引,而第三个参数是该局部变量的新值。该函数的返回值是变量名,如果变量索引超出了范围则返回 nil

目录
相关文章
|
1月前
初始化局部变量和全局变量
【10月更文挑战第3天】初始化局部变量和全局变量。
36 5
|
3月前
|
存储
全局变量和局部变量在堆和栈的区别
全局变量和局部变量在堆和栈的区别
413 0
|
存储 C语言 Perl
西门子S7-1200的变量如何使用?什么是局部变量和全局变量?临时变量和静态变量有什么区别?
今天给大家讲一下什么是局部变量、全局变量、临时变量、静态变量,这些变量都有什么区别,以及在西门子S7-1200中这些变量如何来使用。
西门子S7-1200的变量如何使用?什么是局部变量和全局变量?临时变量和静态变量有什么区别?
|
C++
39.【C/C++ 全局变量和局部变量 (详解)】
39.【C/C++ 全局变量和局部变量 (详解)】
83 0
|
存储 C语言 C++
函数的内部处理及全局变量和局部变量
函数的内部处理及全局变量和局部变量
125 0
函数的内部处理及全局变量和局部变量
|
存储
全局变量和局部变量
全局变量和局部变量
76 0
|
C++
【C++】局部变量和全局变量
有关C++局部变量和全局变量的记录
131 0
【C++】局部变量和全局变量
|
索引
访问非局部变量
访问非局部变量
132 0
|
开发者 Python
全局变量和局部变量 | 学习笔记
快速学习 全局变量和局部变量
129 0