第一版是为 Lua 5.0 编写的。虽然在很大程度上仍然适用于后续版本,但有一些差异。
第四版针对 Lua 5.3,可在 Amazon 和其他书店购买。
购买本书,您还可以帮助 支持 Lua 项目。
![]() |
Lua 中的 编程 | ![]() |
| 第一部分。语言 第 4 章。语句 |
除了全局变量,Lua 还支持局部变量。我们使用 local 语句创建局部变量
j = 10 -- global variable
local i = 1 -- local variable
与全局变量不同,局部变量的作用域仅限于声明它们的块。块是控制结构的主体、函数的主体或块(包含声明变量的代码所在的文件或字符串)。
x = 10
local i = 1 -- local to the chunk
while i<=x do
local x = i*2 -- local to the while body
print(x) --> 2, 4, 6, 8, ...
i = i + 1
end
if i > 20 then
local x -- local to the "then" body
x = 20
print(x + 2)
else
print(x) --> 10 (the global one)
end
print(x) --> 10 (the global one)
请注意,如果您在交互模式下输入此示例,它将无法按预期工作。第二行 local i = 1 本身是一个完整的块。当您输入此行时,Lua 会立即运行它并在下一行开始一个新的块。到那时,local 声明已超出作用域。要在交互模式下运行此类示例,您应该将所有代码都包含在 do 块中。
尽可能使用局部变量是一种良好的编程风格。局部变量可帮助您避免使用不必要的名称弄乱全局环境。此外,访问局部变量的速度比访问全局变量更快。
Lua 将局部变量声明作为语句处理。因此,您可以在可以编写语句的任何位置编写局部声明。作用域从声明后开始,一直持续到块的末尾。声明可以包含初始赋值,其工作方式与常规赋值相同:多余的值会被丢弃;多余的变量会获得 nil。作为一种特殊情况,如果声明没有初始赋值,它将使用 nil 初始化其所有变量。
local a, b = 1, 10
if a<b then
print(a) --> 1
local a -- `= nil' is implicit
print(a) --> nil
end -- ends the block started at `then'
print(a,b) --> 1 10
Lua 中的一个常用惯用语是
local foo = foo此代码创建一个局部变量
foo,并使用全局变量 foo 的值对其进行初始化。当块需要保留 foo 的原始值(即使稍后其他函数更改了全局 foo 的值)时,此惯用语非常有用;它还可以加快对 foo 的访问速度。
由于许多语言强制您在块(或过程)的开头声明所有局部变量,因此有些人认为在块的中间使用声明是一种不好的做法。恰恰相反:仅在需要时声明变量,您很少需要在没有初始值的情况下声明变量(因此您很少忘记对其进行初始化)。此外,您缩短了变量的作用域,从而提高了可读性。
我们可以使用关键字 do-end 明确地限定一个块,用它们括起来。当您需要更精细地控制一个或多个局部变量的作用域时,这些 do 块可能很有用
do
local a2 = 2*a
local d = sqrt(b^2 - 4*a*c)
x1 = (-b + d)/a2
x2 = (-b - d)/a2
end -- scope of `a2' and `d' ends here
print(x1, x2)
| 版权所有 © 2003–2004 Roberto Ierusalimschy。保留所有权利。 | ![]() |