第一版是针对 Lua 5.0 编写的。虽然在很大程度上仍然适用于更高版本,但有一些差异。
第四版针对 Lua 5.3,可在 亚马逊 和其他书店购买。
购买本书,您还可以帮助支持 Lua 项目。
用 Lua 编程 | ||
第二部分。表和对象 第 15 章。包 |
通常,当我们编写一个包时,我们会将所有代码放入一个文件中。然后,要打开或导入一个包(即,使其可用),我们只需执行该文件。例如,如果我们有一个文件 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
中。
版权所有 © 2003–2004 Roberto Ierusalimschy。保留所有权利。 |