访问局部变量

简介: 访问局部变量

我们可以通过函数 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

目录
相关文章
|
3月前
|
开发者
局部变量,在使用时再定义
关于局部变量,适时定义可以提高代码可读性并规避不必要的bug。示例代码中,为了避免误解`checkTaskApplyDTO`仅设置了`userId`,在`existAppliedTask`方法内部,可以通过将`checkTaskApplyDTO`的定义与设置属性的操作靠近,以明确其所有属性值的来源。 另外,本文还展示了一个因提前定义变量`ret`而导致的bug实例。如果将此变量的定义延迟至其实际使用前,则可以避免此类问题。适时定义变量有助于减少混淆,提高代码质量。
30 4
|
2月前
|
存储
全局变量和局部变量在堆和栈的区别
全局变量和局部变量在堆和栈的区别
143 0
|
3月前
成员变量、局部变量和静态变量的区别
成员变量、局部变量和静态变量的区别
21 0
|
5月前
初始化局部变量和全局变量
初始化局部变量和全局变量
42 0
|
存储 C语言 Perl
西门子S7-1200的变量如何使用?什么是局部变量和全局变量?临时变量和静态变量有什么区别?
今天给大家讲一下什么是局部变量、全局变量、临时变量、静态变量,这些变量都有什么区别,以及在西门子S7-1200中这些变量如何来使用。
西门子S7-1200的变量如何使用?什么是局部变量和全局变量?临时变量和静态变量有什么区别?
|
存储 C语言 C++
函数的内部处理及全局变量和局部变量
函数的内部处理及全局变量和局部变量
114 0
函数的内部处理及全局变量和局部变量
|
存储
局部变量和成员变量的4个区别
定义位置不同、内存中的位置不同、周期不同、初始化不同。
110 0
|
索引
访问非局部变量
访问非局部变量
127 0
|
人工智能 Java
变量的值传递,地址引用(和对象成员变量、局部变量创建和初始化的内存机制)
变量的值传递,地址引用(和对象成员变量、局部变量创建和初始化的内存机制)
171 0
变量的值传递,地址引用(和对象成员变量、局部变量创建和初始化的内存机制)