一)全局-局部变量
全局变量是指:这个变量在没有被同名局部变量覆盖的时候,所有代码块都是可见的。
局部变量是指:该变量只在被申明的代码块中可见,并且可以覆盖同名全局变量或者外层局部变量。
Lua 中的局部变量要用 local 关键字来显式定义,不使用 local 显式定义的变量就是全局变量:
g_var = 1 -- 全局变量
local l_var = 2 -- 局部变量
1)局部变量作用域
局部变量的生命周期是有限的,它的作用域仅限于声明它的块(block)。
一个块是一个控制结构的执行体、或者是一个函数的执行体再或者是一个程序块(chunk)。
我们可以通过下面这个例子来理解一下局部变量作用域的问题:
x = 10 -- 全局变量 local i = 1 -- 程序块中的局部变量 i while i <=x do -- 判断条件的x为全局变量的x local x = i * 2 -- while 循环体中的局部变量 x print(x) -- output: 2, 4, 6, 8, ... i = i + 1 end print("while循环结束"); if i > 20 then local x -- then 中的局部变量 x x = 20 print(x + 2) -- 如果i > 20 将会打印 22,此处的 x 是局部变量 else print(x) -- 打印 10,这里 x 是全局变量 end print(x) -- 打印 10
2)使用局部变量的好处
局部变量可以避免因为命名问题污染了全局环境
local 变量的访问比全局变量更快
由于局部变量出了作用域之后生命周期结束,这样可以被垃圾回收器及时释放
在生产环境中,我们应该尽可能用 局部变量。
3)全局变量,其实本质上也是一个table,它把我们创建的全局变量都保存到一个table里了。
而这个table的名字是:_G
-- 定义一个全局变量
gName = "我是个全局变量";
-- 用三种方式输出变量的值
print(gName);
print(_G["gName"]);
print(_G.gName);
二)虚变量
当一个方法返回多个值时,有些返回值有时候用不到,要是声明很多变量来一一接收,显然不太合适(不是不能)。
Lua 提供了一个虚变量,以单个下划线(“_”)来命名,用它来丢弃不需要的数值,仅仅起到占位的作用。
local start, finish = string.find("hello", "he") --start 值为起始下标,finish --值为结束下标 print ( start, finish ) --输出 1 2 local start = string.find("hello", "he") -- start值为起始下标 print ( start ) -- 输出 1 local _,finish = string.find("hello", "he") --采用虚变量(即下划线),接收起 --始下标值,然后丢弃,finish接收 --结束下标值 print ( finish ) --输出 2
代码倒数第二行,定义了一个用 local 修饰的 虚变量(即 单个下划线)。使用这个虚变量接收 string.find() 第一个返回值,静默丢掉,这样就直接得到第二个返回值了。
虚变量不仅仅可以被用在返回值,还可以用在迭代等。
local t = {1, 3, 5} print("all data:") for i,v in ipairs(t) do print(i,v) end print("") print("part data:") for _,v in ipairs(t) do print(v) end 执行结果: # luajit test.lua all data: 1 1 2 3 3 5 part data: 1 3 5
本文来自博客园,作者:孙龙-程序员,转载请注明原文链接:https://www.cnblogs.com/sunlong88/p/17950633