第一版是为 Lua 5.0 编写的。虽然在很大程度上仍然适用于后续版本,但有一些差异。
第四版针对 Lua 5.3,可在 Amazon 和其他书店购买。
购买本书,您还可以帮助 支持 Lua 项目


4.2 – 局部变量和块

除了全局变量,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)