Lua local 变量的使用(简单梳理)

Note:

1.Lua 中的变量全是全局变量,无论语句块或是函数里,除非用 local 显式声明为局部变量,变量默认值均为nil

2.使用local创建一个局部变量,与全局变量不同,局部变量只在被声明的那个代码块内有效。(代码块:指的是一个控制结构内,一个函数体,或者一个chunk(变量被声明的那个文件或者文本串))

x = 10
local i = 1                 --local to the chunk

while i <= x do
    local x = i * 2           --local to the while body
    print(x)
    i = i + 1
end

if i > 20 then 
    local x                     -- local to the "then" body
    x = 20
    print(x + 2)
else
    print(x)
end

print(x)

运行结果:

 注意:如果在交互模式下上面的例子可能不能输出如期结果,因为第二句的local i=1是一个完整的chunk,在交互模式下执行完这一句后,Lua 将开始一个新的chunk,这样第二句的i 已经超出他的有效范围。可将这段代码放在do...end中(相当于C的{...})

3.尽可能使用局部变量,有两个好处

          a.避免命名冲突

          b.访问速度更快(原因是local变量是存放在lua的堆栈里面的是array操作,而全局变量是存放在_G中的table中,效率不及堆栈)

4. Lua中的函数可以作为全局变量也可作为局部变量,当我们将函数保存在一个局部变量里时,我们将得到一个局部函数。局部函数和局部变量一样在一定范围内有效。

          a. 使用function声明的函数为全局函数,在被引用时可以不会因为声明的顺序而找不到 
          b. 使用local function声明的函数为局部函数,在引用的时候必须要在声明的函数后面

function test()
    test2()
    test1()
end
 
local function test1()
    print("hello test1")
end
 
function test2()
    print("hello test2")
end
 
test()

 运行结果:

结果报错,因为局部函数test1未先声明。

5.其他补充:

        a.local变量过多也会有堆栈溢出的问题,一段过程下最多拥有200个local变量,且do end不算。类似这样:

local Class = {}

local test1 = 1

local test2 = 2

... --to 199

return Class
    如果超过199,则会报出main function has more than 200 local variables的错误。当然这里说的是一段过程,所以函数是另算的,同样一个函数的过程最多也不能超过200个local变量(调用函数则算转入下一个过程了)。

      b.模块级local变量暂无限制,但是也要考虑到热更新方面的问题:若是选择使用模块级local变量去存储模块的数据,那么在热更新方面的处理将会变得十分麻烦。从这点考虑的话,模块级local变量最好只是用于引用别的模块为妙。

参考资料:

https://www.cnblogs.com/robinunix/p/7872561.html

https://musoucrow.github.io/2018/04/17/lua_local/

### Lua 中 `local` 关键字的用法 在 Lua 编程语言中,`local` 关键字用于声明局部变量。这有助于减少全局命名空间污染并提高性能。 #### 局部变量的作用域 当使用 `local` 声明变量时,该变量仅在其被定义的函数或块内可见。一旦超出这个范围,变量就不再可访问[^1]。 ```lua -- 定义一个局部变量 local message = "Hello, world!" print(message) -- 输出: Hello, world! function greet() print(message) -- 可以访问外部的局部变量 end greet() message_global = "This is global" print(_G["message"]) -- nil, 因为 'message' 是局部变量 print(_G["message_global"]) -- This is global ``` #### 函数中的局部变量 可以在函数内部创建局部变量来存储临时数据而不影响其他部分: ```lua function createCounter() local count = 0 return function() count = count + 1 return count end end counter = createCounter() print(counter()) -- 输出: 1 print(counter()) -- 输出: 2 ``` 这里展示了闭包的概念,即返回的匿名函数能够记住它所处环境的状态(如这里的计数器)。由于 `count` 被标记为 `local`,因此不会干扰程序其它地方可能存在的同名变量。 #### 使用 `require` 加载模块时的局部化 通过将 `require` 的结果赋给局部变量可以避免不必要的全局名称冲突: ```lua local foo = require "foo" foo.go() ``` 这段代码片段表明如何安全地引入第三方库而无需担心其接口会覆盖现有的全局对象。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值