On this page

Lua 变量

Lua 变量详解

Lua 中的变量是用来存储数据的标识符,了解变量是学习 Lua 编程的基础。以下是 Lua 变量的全面介绍:

1. 变量类型

Lua 中有三种变量类型:

全局变量

  • 默认情况下所有变量都是全局的
  • 生命周期从创建到程序结束
  • 访问速度比局部变量慢
-- 全局变量
globalVar = "I'm global"
print(globalVar)  -- 输出: I'm global

局部变量 (推荐使用)

  • 使用 local 关键字声明
  • 只在声明它的块内有效
  • 访问速度更快
do
  local localVar = "I'm local"
  print(localVar)  -- 输出: I'm local
end
-- print(localVar)  -- 这里会报错,因为超出了作用域

表中的域

  • 表(table)中的字段也是一种变量
local t = {}
t.field = "I'm a table field"
print(t.field)  -- 输出: I'm a table field

2. 变量命名规则

  • 可以包含字母、数字和下划线
  • 不能以数字开头
  • 区分大小写
  • 避免使用下划线开头接大写字母(如 _VERSION),这类名称通常被Lua保留
  • 避免使用Lua关键字

合法变量名示例:

local userName = "John"
local item3 = "book"
local _temp = 25

3. 变量作用域

代码块作用域

  • 局部变量的作用域从声明点开始到所在块结束
  • 块可以是 do-end、函数体、控制结构体等
local x = 10  -- 外层x

do
  local x = 20  -- 内层x
  print(x)      -- 输出: 20
end

print(x)        -- 输出: 10

函数作用域

  • 函数参数是局部变量
  • 函数内声明的变量只在函数内有效
local function test(a)  -- a是局部变量
  local b = a * 2
  return b
end

-- print(a)  -- 错误,a不可见
-- print(b)  -- 错误,b不可见

4. 多重赋值

Lua 支持同时给多个变量赋值:

-- 基本多重赋值
local a, b = 10, 20
print(a, b)  -- 输出: 10   20

-- 交换变量值
a, b = b, a
print(a, b)  -- 输出: 20   10

-- 变量比值多时,多余变量赋nil
local x, y, z = 1, 2
print(x, y, z)  -- 输出: 1   2   nil

-- 值比变量多时,多余的值被忽略
local m, n = 1, 2, 3
print(m, n)     -- 输出: 1   2

5. 变量使用建议

  1. 尽量使用局部变量

    • 性能更好
    • 避免命名冲突
    • 代码更清晰
  2. 避免污染全局空间

    -- 不好的做法
    function createUser()
      userName = "John"  -- 意外创建了全局变量
    end
       
    -- 好的做法
    function createUser()
      local userName = "John"  -- 使用局部变量
    end
    
  3. 合理命名变量

    • 使用有意义的名称
    • 保持命名风格一致
    • 对于常量,可以使用全大写命名

6. 特殊变量 _G

Lua 提供了一个名为 _G 的全局表,所有全局变量都是这个表的字段:

myGlobal = "test"
print(_G.myGlobal)  -- 输出: test

-- 遍历所有全局变量
for k, v in pairs(_G) do
  print(k, v)
end

7. 变量的生命周期

  • 全局变量:从创建到程序结束
  • 局部变量:从声明点到所在块结束
  • 表字段:从创建到表被销毁或字段被置为nil
do
  local temp = "temporary"
  -- temp在这里可用
end
-- temp在这里已经被销毁

collectgarbage()  -- 强制垃圾回收

理解 Lua 变量的作用域和生命周期对于编写正确的 Lua 程序至关重要。合理使用局部变量可以提高代码性能和可维护性。