我已经阅读了关于创建模块的PIL和ModulesTutorial,但我在正确使用require()时遇到了问题。
下面是我的设置:
-- File ./lib/3rdparty/set.lua
local ipairs = ipairs
module( "set" )
function newSet (t)
local set = {}
for _, l in ipairs(t) do set[l] = true end
return set
end和:
-- File ./snowplow.lua
local set = require( "lib.3rdparty.set" )
module( "snowplow" )
local SUPPORTED_PLATFORMS = set.newSet { "pc", "tv", "mob", "con", "iot" }然后如果我运行snowplow.lua
lua: snowplow.lua:4: attempt to index local 'set' (a boolean value)
stack traceback:
snowplow.lua:4: in main chunk
[C]: ?我在模块定义中做错了什么--布尔值到底是什么?另外,如果我在set.lua的底部附加了一个return _M;,那么一切都开始工作了--为什么?
发布于 2013-04-13 22:39:38
如果在模块中不使用module函数,并且模块代码不返回值,则true通常由require返回。
但不管怎样,这看起来很奇怪。
-- file m0.lua
module'm0'
--file dir1\m1.lua
module'm1'
--file test.lua
print(require'm0')
print(m0)
print(require'dir1.m1')
print(m1)
for k,v in pairs(package.loaded) do
if k:match'm%d' then print(k, v) end
end
--output
table: 0036C8C8
table: 0036C8C8
true
table: 0036B6B0
m0 table: 0036C8C8
m1 table: 0036B6B0
dir1.m1 true因此,您可以简单地使用全局变量set,而不是由require返回的局部set。
更新:
建议避免使用module函数,并始终在模块末尾使用return。在这种情况下,整个画面就很好了:
-- file m0.lua
return 'string0'
--file dir1\m1.lua
return 'string1'
--file test.lua
print(require'm0')
print(m0)
print(require'dir1.m1')
print(m1)
for k,v in pairs(package.loaded) do
if k:match'm%d' then print(k, v) end
end
--output
string0
nil
string1
nil
m0 string0
dir1.m1 string1UPD2 :
如果您用module('lib.3rdparty.set')替换module( "set" ),问题就会消失。
因此,每个模块都必须记住它的相对路径。
现在,您可以通过调用require'lib.3rdparty.set'或读取全局变量lib.3rdparty.set来访问它-结果将是相同的。
发布于 2015-01-30 02:02:23
require("lib.moduleName")
local moduleName = moduleName我不知道为什么当你需要一个不同目录下的模块时Lua会返回一个布尔值,但是这个模块似乎在全局变量上被正确设置了。所以我简单地使用了它,并把它放在了一个同名的局部变量上。
https://stackoverflow.com/questions/15988268
复制相似问题