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


15.3 – 包和文件

通常,当我们编写一个包时,我们会将所有代码放入一个文件中。然后,要打开或导入一个包(即,使其可用),我们只需执行该文件。例如,如果我们有一个文件 complex.lua,其中包含我们复杂包的定义,则命令 require "complex" 将打开该包。请记住,require 避免多次加载同一个包。

一个反复出现的问题是文件名和包名之间的关系。当然,将它们关联起来是个好主意,因为 require 使用文件,而不是包。一个解决方案是将文件名命名为包名,后跟一些已知的扩展名。Lua 不会修复任何扩展名;由您的路径来完成此操作。例如,如果您的路径包含 "/usr/local/lualibs/?.lua" 这样的组件,那么包 complex 可能会存在于 complex.lua 文件中。

有些人更喜欢相反的做法,即动态地根据文件名命名包。也就是说,如果您重命名文件,则包也会重命名。此解决方案为您提供了更大的灵活性。例如,如果您得到两个具有相同名称的不同包,则不必更改任何一个包,只需重命名一个文件即可。要在 Lua 中实现此命名方案,我们使用 _REQUIREDNAME 变量。请记住,当 require 加载文件时,它会使用虚拟文件名定义该变量。因此,您可以在包中编写类似以下内容

    local P = {}   -- package
    if _REQUIREDNAME == nil then
      complex = P
    else
      _G[_REQUIREDNAME] = P
    end
此测试允许我们在不使用 require 的情况下使用该包。如果未定义 _REQUIREDNAME,我们将为该包使用一个固定的名称(在本例中为 complex)。否则,该包会使用虚拟文件名(无论是什么)注册自身。如果用户将库放入文件 cpx.lua 中并运行 require"cpx",则该包会将自身加载到表 cpx 中。如果另一位用户将库移动到文件 cpx_v1.lua 中并运行 require"cpx_v1",则该包会将自身加载到表 cpx_v1 中。