Lua 变量
Lua - 变量
Section titled “Lua - 变量”变量是赋予内存位置的符号名称,用于存储值。在 Lua 中,变量可以保存各种类型的值,包括数字、字符串、布尔值、函数和表。Lua 是一种动态类型语言,这意味着你无需声明变量的类型;它的类型由它所持有的值决定。
变量名(标识符)必须以字母或下划线开头,后跟零个或多个字母、数字或下划线。Lua 区分大小写,因此 myVariable 和 myvariable 是不同的。
Lua 支持两种主要的变量作用域:
- **全局变量:**除非明确声明为 local,否则变量默认为全局变量。全局变量在 Lua 程序(或代码块 chunk)的任何地方都可以访问。它们存储在一个特殊的表(通常称为环境表
_G)中。过度使用全局变量通常不被推荐,因为它可能导致命名冲突并使得代码更难维护。 - **局部变量:**使用
local关键字声明。它们的作用域限制在声明它们的块(例如函数、循环、if语句或文件/代码块)内。使用局部变量是一种最佳实践,因为它可以提高代码可读性,避免意外修改,并且由于优化的访问而可能略快。 - **表字段:**虽然不是严格意义上的作用域,但变量也可以是表的字段(或成员)。它们的访问性取决于表本身的访问性,例如
myTable.myField = 10。
变量声明与赋值
Section titled “变量声明与赋值”在 Lua 中,变量通常在第一次被赋值时创建。如果你给一个未声明 local 的名称赋值,它就会成为一个全局变量。除非你有特殊原因需要全局变量,否则最好始终使用 local。
-- 全局变量(如无特殊原因,请尽量避免)count = 10
-- 局部变量(推荐)local name = "Lua User"
-- 多重赋值local x, y, z = 1, 2, "hello"
-- 如果值少于变量,剩余变量将被赋值为 nillocal a, b, c = 10, 20-- a 是 10, b 是 20, c 是 nilprint("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 被初始化为 nilprint("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)示例:变量交换与使用
Section titled “示例:变量交换与使用”此示例演示了变量声明、初始化以及 Lua 中用于交换变量值的常用方法。
-- 变量声明(如果未赋值,隐式初始化为 nil)local a, b
-- 初始化a = 10b = 30
print("a 的初始值:", a) -- 输出: 10print("b 的初始值:", b) -- 输出: 30
-- 使用多重赋值交换变量(典型的 Lua 用法)b, a = a, b
print("交换后 a 的值:", a) -- 输出: 30print("交换后 b 的值:", b) -- 输出: 10
local result = 70.0 / 3.0print("result 的值(浮点除法):", result) -- 输出: 23.333333333333Lua 中的左值 (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)可以帮助捕获此类问题。