3

我已经阅读了关于创建模块的 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]: ?

我在模块定义中做错了什么 - 布尔值到底是什么?return _M;另外,如果我在底部附加 a set.lua,那么一切都会开始工作 - 为什么?

4

2 回答 2

2

true通常由requireifmodule函数在模块内部未使用并且模块代码不返回值返回。
但无论如何,这似乎很奇怪。

-- 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:
建议避免在模块末尾使用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 string1

UPD2:
如果替换为 ,问题就会module( "set" )消失module('lib.3rdparty.set')
所以,每个模块都必须记住它的相对路径
现在您可以通过调用require'lib.3rdparty.set'或读取全局变量来访问它lib.3rdparty.set——结果是一样的。

于 2013-04-13T14:39:38.427 回答
0
require("lib.moduleName")
local moduleName = moduleName

我不确定为什么当您需要不同目录中的模块时 Lua 返回布尔值,但似乎该模块已正确设置在全局变量上。所以我只是简单地使用它并将它放在同名的局部变量上。

于 2015-01-29T18:02:22.963 回答