Module 在Lua中的require()d模块上调用函数会给我;尝试索引本地';x';(一个布尔值)“;
我已经阅读了PIL和关于创建模块的说明,但是我在正确设置模块时遇到了问题 以下是我的设置:Module 在Lua中的require()d模块上调用函数会给我;尝试索引本地';x';(一个布尔值)“;,module,lua,Module,Lua,我已经阅读了PIL和关于创建模块的说明,但是我在正确设置模块时遇到了问题 以下是我的设置: -- 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 以及: 然后如果我运行雪犁.lua: lua: snowplow.lu
-- 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
以及:
然后如果我运行雪犁.lua
:
lua: snowplow.lua:4: attempt to index local 'set' (a boolean value)
stack traceback:
snowplow.lua:4: in main chunk
[C]: ?
我在模块定义中做错了什么-布尔值到底是什么?另外,如果我附加一个
return\M代码>在我的集合的底部。lua
,然后一切都开始工作-为什么?如果模块内未使用模块
函数且模块代码未返回值,则通常由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
而不是本地set
分配一个由require
返回的值
UPD:
建议避免使用模块
功能,并始终返回
模块末尾的表格。在这种情况下,整个画面很好:
-- 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 string1
UPD2:
如果用模块('lib.3rdparty.set')
替换模块(“set”)
,问题就会消失
因此,每个模块必须记住其相对路径
现在您可以通过调用require'lib.3rdparty.set'
或读取全局变量lib.3rdparty.set
来访问它-结果将是相同的
require("lib.moduleName")
local moduleName = moduleName
我不确定当您需要在不同目录上的模块时,为什么Lua会返回布尔值,但似乎在全局变量上正确设置了该模块。因此,我只是简单地使用了它,并将其放在一个同名的局部变量上。Wow-这在您的UPD2 Egor中是一个非常好的发现,谢谢分享。标记为正确答案!
require("lib.moduleName")
local moduleName = moduleName