首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Lua中调用require()d模块上的函数会给我“尝试索引本地'x‘(布尔值)”

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

Stack Overflow用户
提问于 2013-04-13 21:22:45
回答 2查看 3.7K关注 0票数 3

我已经阅读了关于创建模块的PIL和ModulesTutorial,但我在正确使用require()时遇到了问题。

下面是我的设置:

代码语言:javascript
复制
-- 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

和:

代码语言:javascript
复制
-- File ./snowplow.lua
local set = require( "lib.3rdparty.set" )
module( "snowplow" )
local SUPPORTED_PLATFORMS = set.newSet { "pc", "tv", "mob", "con", "iot" }

然后如果我运行snowplow.lua

代码语言:javascript
复制
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;,那么一切都开始工作了--为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-13 22:39:38

如果在模块中不使用module函数,并且模块代码不返回值,则true通常由require返回。

但不管怎样,这看起来很奇怪。

代码语言:javascript
复制
-- 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。在这种情况下,整个画面就很好了:

代码语言:javascript
复制
-- 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('lib.3rdparty.set')替换module( "set" ),问题就会消失。

因此,每个模块都必须记住它的相对路径。

现在,您可以通过调用require'lib.3rdparty.set'或读取全局变量lib.3rdparty.set来访问它-结果将是相同的。

票数 2
EN

Stack Overflow用户

发布于 2015-01-30 02:02:23

代码语言:javascript
复制
require("lib.moduleName")
local moduleName = moduleName

我不知道为什么当你需要一个不同目录下的模块时Lua会返回一个布尔值,但是这个模块似乎在全局变量上被正确设置了。所以我简单地使用了它,并把它放在了一个同名的局部变量上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15988268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档