Module 在Lua中的require()d模块上调用函数会给我;尝试索引本地';x';(一个布尔值)“;

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

我已经阅读了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.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