Lua:使用“local var = require(“ my lib”)”出现问题。

许多 Lua 脚本都包括添加模块到脚本中的操作:

local module = require("module")

但根据 lua-manual,这不是加载模块的正确方式。模块本身包括它们的模块名称,因此下面的代码就足以使用该模块:require("module"),例如 module.myfunction()。第一个用本地变量定义加载方式的示例仅将“true”写入模块变量,表示模块已成功加载。

奇怪的是,我在 Web 上看到这种加载方式 local module = require("module") 到处都是。大多数来自 Lua 社区的脚本由于这个错误无法工作。我也想知道为什么在 Web 上还没有找到有关此错误的问题。

接下来,实际加载模块有时也会导致奇怪的错误。例如:我有一个使用以下代码的脚本:

require("purexml.lua")

然后出现以下错误:

no field package.preload['purexml.lua']
no file './purexml/lua.lua'
no file '/usr/local/share/lua/5.1/purexml/lua.lua'
no file '/usr/local/share/lua/5.1/purexml/lua/init.lua'
no file '/usr/local/lib/lua/5.1/purexml/lua.lua'
no file '/usr/local/lib/lua/5.1/purexml/lua/init.lua'
no file './purexml/lua.so'
no file '/usr/local/lib/lua/5.1/purexml/lua.so'
no file '/usr/local/lib/lua/5.1/loadall.so'
no file './purexml.so'
no file '/usr/local/lib/lua/5.1/purexml.so'
no file '/usr/local/lib/lua/5.1/loadall.so'

但是以下代码却可以正常工作:

require("purexml")

我是不是漏掉了什么非常明显的步骤?顺便说一句,我使用的是 Lua 5.1.4...

点赞
用户565635
用户565635

local module = require("module") 创建了一个本地的变量,其中包含了该模块,除此以外还有一个默认的全局变量(当然,如果本地变量和全局变量重名了,本地变量会覆盖全局变量)。在 Lua 中,访问本地变量要比访问全局变量快很多,所以很可能这正是使用这种方式的原因所在。

而你得到的错误很明显,你在加载模块时不应该添加文件扩展名。

2012-09-29 14:20:07
用户1008957
用户1008957

在 Lua 5.2 中,规范的模块不再导出全局变量,而在 Lua 5.1 中导出全局变量。

除了使用 local 变量提高速度之外,使用 local module = require "module" 也应该用于与最新版本的 Lua 兼容。

2012-09-29 14:47:21