Skip to content

Lua 变量

变量是赋予内存位置的符号名称,用于存储值。在 Lua 中,变量可以保存各种类型的值,包括数字、字符串、布尔值、函数和表。Lua 是一种动态类型语言,这意味着你无需声明变量的类型;它的类型由它所持有的值决定。

变量名(标识符)必须以字母或下划线开头,后跟零个或多个字母、数字或下划线。Lua 区分大小写,因此 myVariable 和 myvariable 是不同的。

Lua 支持两种主要的变量作用域:

  • **全局变量:**除非明确声明为 local,否则变量默认为全局变量。全局变量在 Lua 程序(或代码块 chunk)的任何地方都可以访问。它们存储在一个特殊的表(通常称为环境表 _G)中。过度使用全局变量通常不被推荐,因为它可能导致命名冲突并使得代码更难维护。
  • **局部变量:**使用 local 关键字声明。它们的作用域限制在声明它们的块(例如函数、循环、if 语句或文件/代码块)内。使用局部变量是一种最佳实践,因为它可以提高代码可读性,避免意外修改,并且由于优化的访问而可能略快。
  • **表字段:**虽然不是严格意义上的作用域,但变量也可以是表的字段(或成员)。它们的访问性取决于表本身的访问性,例如 myTable.myField = 10。

在 Lua 中,变量通常在第一次被赋值时创建。如果你给一个未声明 local 的名称赋值,它就会成为一个全局变量。除非你有特殊原因需要全局变量,否则最好始终使用 local。

-- 全局变量(如无特殊原因,请尽量避免)
count = 10
-- 局部变量(推荐)
local name = "Lua User"
-- 多重赋值
local x, y, z = 1, 2, "hello"
-- 如果值少于变量,剩余变量将被赋值为 nil
local a, b, c = 10, 20
-- a 是 10, b 是 20, c 是 nil
print("a=", a, "b=", b, "c=", c)
-- 如果值多于变量,多余的值将被丢弃
local d, e = 100, 200, 300
-- d 是 100, e 是 200 (300 被丢弃)
print("d=", d, "e=", e)

未赋初始值的 local 变量会自动初始化为 nil。

local myVar -- myVar 被初始化为 nil
print("myVar is: ", myVar)

你可以通过给变量赋一个新值来改变它的值(以及隐式地,改变它的类型)。

local data = 100 -- data 是一个数字
print(type(data), data)
data = "Switched to string" -- 现在 data 是一个字符串
print(type(data), data)
data = { key = "value" } -- 现在 data 是一个表
print(type(data), data.key)

此示例演示了变量声明、初始化以及 Lua 中用于交换变量值的常用方法。

-- 变量声明(如果未赋值,隐式初始化为 nil)
local a, b
-- 初始化
a = 10
b = 30
print("a 的初始值:", a) -- 输出: 10
print("b 的初始值:", b) -- 输出: 30
-- 使用多重赋值交换变量(典型的 Lua 用法)
b, a = a, b
print("交换后 a 的值:", a) -- 输出: 30
print("交换后 b 的值:", b) -- 输出: 10
local result = 70.0 / 3.0
print("result 的值(浮点除法):", result) -- 输出: 23.333333333333

Lua 中的左值 (Lvalues) 和右值 (Rvalues)

Section titled “Lua 中的左值 (Lvalues) 和右值 (Rvalues)”

虽然 Lua 不像 C/C++ 那样严格使用这些术语,但这些概念仍然很有用:

  • **左值 (Lvalue / Locator value):**指代可以存储值的内存位置的表达式(例如变量名 x,或表字段 myTable.field 或 myTable[index])。左值可以出现在赋值语句的左侧。
  • **右值 (Rvalue / Right-hand value):**产生数据值的表达式。右值可以出现在赋值语句的右侧。字面量(如 10 或 "hello")和表达式(如 a + b)通常是右值。

在 Lua 中,变量和表字段是左值:

local g -- 左值
g = 20 -- 20 是右值

字面量不能是左值:

-- 10 = 20 -- 这是无效的,会导致语法错误。

Lua 的多重赋值允许在一条语句中使用多个左值和右值:

local x, y -- x 和 y 是左值
x, y = 100, 200 -- 100 和 200 是右值
-- x 变为 100, y 变为 200

**常见陷阱:**如果你忘记使用 local,很容易意外创建全局变量。Linters 或严格模式(在旧版 Lua 中使用 require "strict",或在现代环境中使用 linters)可以帮助捕获此类问题。