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


1.1 – 块

Lua 执行的每段代码(例如文件或交互模式中的单行)都是一个。更具体地说,块只是一系列语句。

分号可以跟在任何语句后面。通常,我仅使用分号来分隔写在同一行中的两个或更多个语句,但这只是一种约定。换行在 Lua 语法中不起作用;例如,以下四个块都是有效且等效的

    a = 1
    b = a*2
    
    a = 1;
    b = a*2;
    
    a = 1 ; b = a*2
    
    a = 1   b = a*2    -- ugly, but valid

块可以像“hello world”示例中一样简单,也可以由语句和函数定义(实际上是赋值,我们稍后会看到)的混合组成,例如阶乘示例。块可以任意大。由于 Lua 也用作数据描述语言,因此几个兆字节的块并不少见。Lua 解释器对大尺寸没有任何问题。

您可以运行独立解释器以交互模式运行,而不是将程序写入文件。如果您在没有任何参数的情况下调用 Lua,您将获得其提示

    Lua 5.0  Copyright (C) 1994-2003 Tecgraf, PUC-Rio
    >
此后,您键入的每个命令(例如 print "Hello World")都会在您按 <enter> 后立即执行。要退出交互模式和解释器,只需键入文件结尾(Unix 中的 ctrl-D,DOS/Windows 中的 ctrl-Z),或从操作系统库中调用 exit 函数(您必须键入 os.exit()<enter>)。

在交互模式下,Lua 通常将您键入的每一行解释为一个完整的块。但是,如果它检测到该行不能形成一个完整的块,它将等待更多输入,直到它有一个完整的块。当 Lua 等待行续行时,它会显示一个不同的提示(通常为 >>)。因此,您可以直接在交互模式下输入多行定义,例如 factorial 函数。然而,有时将此类定义放在文件中并调用 Lua 来运行该文件会更方便。

您可以通过使用 -l 选项将它们全部作为参数传递给独立解释器,来执行一系列块。例如,如果您有一个包含单个语句 x=1 的文件 a 和另一个包含语句 print(x) 的文件 b,则命令行

    prompt> lua -la -lb
将在 a 中运行块,然后在 b 中运行块,这将打印预期的 1。(-l 选项实际上调用 require,它在特定路径中查找文件。因此,如果此路径不包含当前目录,则前一个示例将不起作用。我们将在 第 8.1 节 中更详细地讨论 require 函数。)

你可以使用 -i 选项指示 Lua 在运行给定块后启动交互式会话。类似这样的命令行

    prompt> lua -i -la -lb
将在 a 中运行块,然后在 b 中运行块,然后提示你进行交互。这对于调试和手动测试特别有用。在本章的末尾,我们将看到独立解释器的其他选项。

链接块的另一种方法是使用 dofile 函数,它会立即执行一个文件。例如,你可能有一个文件 lib1.lua

    -- file 'lib1.lua'
    
    function norm (x, y)
      local n2 = x^2 + y^2
      return math.sqrt(n2)
    end
    
    function twice (x)
      return 2*x
    end
然后,在交互模式中,你可以键入
    > dofile("lib1.lua")   -- load your library
    > n = norm(3.4, 1.0)
    > print(twice(n))      --> 7.0880180586677

在测试一段代码时,dofile 函数也很有用。你可以使用两个窗口:其中一个是带有你的程序的文本编辑器(例如,在文件 prog.lua 中),另一个是在交互模式下运行 Lua 的控制台。在你对程序进行修改并保存后,你在 Lua 控制台中执行 dofile("prog.lua") 以加载新代码;然后你可以练习新代码,调用其函数并打印结果。