变量

变量就是给一块内存区域赋予的一个名字。变量使得在程序中就可以修改或读取相应的内存区域中的内容。它可以代表各种不同类型的值,包括函数与表。

变量的名字由字母、数字与下划线组成。它必须是字母或下划线开头。由于 Lua 是字母大小写敏感的,所以大写字母与小写字母是不一样的。Lua 中有八种基本值类型:

在 Lua 语言中,虽然我们没有变量数据类型,但是依据变量的作用域我们可以将变量分为三类:

  • 全局变量:除非显示的声明一个局部变量,否则所有的变量都被默认当作全局变量。
  • 局部变量:如果我们将一个变量定义为局部变量,那么这么变量的作用域就被限制在函数内。
  • 表字段:这种特殊的变量可以是除了 nil 以外的所有类型,包括函数。

Lua 变量定义

一个变量定义就意味着告诉解释器在什么地方创建多大的一块存储空间。一个变量定义包括一个可选的类型( type )以及该类型的一个或多个变量名的列表,如下所示:

type variable_list;

其中,type 是可以选择指定为 local 或者不指定使用默认值 global,variable_list 是包含一个或多个由逗号分隔的标识符名字。下面是合法变量定义的示例:

local    i, j
local    i
local    a,c

local i,j 声明定义了两个变量 i 与 j;它命令解释器创建两个名称分别为 i,j 的变量,并且将其作用域限制在局部。

在声明变量的时候可以同时初始化变量(为变量赋初值)。在变量名后跟上等号和一个常量表达式就可以初始化变量。如下所示:

type variable_list = value_list;

一些例子如下:

local d , f = 5 ,10 --声明局部变量 d,f。 
d , f = 5, 10;      --声明全局变量 d,f。 
d, f = 10           --[[声明全局变量 d,f,其中 f 的值是 nil--]]

如果只是定义没有初始化,则静态存储变量被隐式初始化为 nil。

Lua 变量声明

正如在上面例子看到的那样,为多个变量赋值就是在变量列表后跟上值列表。例子 local d,f = 5,10 中,变量列表是 d,f,值列表是 5,10。

Lua 赋值时会将第一个值赋给第一个变量,第二个值赋给第二个变量,依次类推。所以,d 的值是 5,f 的值是 10。

示例

下面的示例中,变量被声明在顶部,但是它们在主函数中定义和初始化:

-- 变量定义:
local a, b
-- 初始化
a = 10
b = 30
print("value of a:", a)
print("value of b:", b)
-- 交换变量的值
b, a = a, b
print("value of a:", a)
print("value of b:", b)
f = 70.0/3.0
print("value of f", f)

上面的代码被编译生成和执行后,会产生如下的结果:

value of a:	10
value of b:	30
value of a:	30
value of b:	10
value of f	23.333333333333

Lua 中的左值与右值

Lua 中有两种表达式:

  • 左值:引用内存位置的表达式被称之为左值表达式。左值表达式既可以出现在赋值符号的左边也可以出现在赋值符号的右边。
  • 右值:术语“右值”指存在内存某个位置的数据值。我们不能为右值表达式赋值,也就是说右值表达式只可能出现在赋值符号的右边,而不可能出现在赋值符号的左边。
变量属于左值表达式,所以它可以现在赋值符号的左边。数值常量属于右值表达式,它不能被赋值也不能出现在赋值符号的左边。下面是合法的语句:
g = 20

但是,下面的语句是非法的,它会产生生成时错误:

10 = 20 

在 Lua 语言中,除了上面讲的这种赋值,还允许在一个赋值语句中存在多个左值表达式与多个右值表达式。如下所示:

g,l = 20,30

在这个语句中,g 被赋值为 20,l 被赋值为 30。