无法使用Lua导入模块,导致尝试索引全局'test'(零值)

时间:2014-07-22 21:52:31

标签: lua importerror

如果没有成功,我尝试使用require关键字将我自己的Lua文件导入到其他脚本中,但每当我尝试调用导入模块中包含的任何函数时(例如" test.lua")我到达后续错误:

require 'test'
test.method(args)
==> yields error: 
==> Attempt to index global 'test' (a nil value) 

我已将文件添加到package.path,以防这是问题,但同样没有开始错误,表明它无法在Lua的路径中找到该文件。

package.path = package.path .. ";/path/to/test.lua"
require 'test'
test.method(args)
==> yields error: 
==> Attempt to index global 'test' (a nil value) 

我从文件所在的目录运行交互式Lua shell。尝试打印本地变量名称时,例如local test = require" test"价值是零。

package.path = package.path .. ";/path/to/test.lua"
local test = require 'test'
print(test)
==> nil

思考? (注意:我还需要一般文件而不将其分配给局部变量,并再次使用nil作为返回值打印其值。)

2 个答案:

答案 0 :(得分:3)

扩展lhf的答案:

Lua shell一次读取一条语句。然后,它使用loadstring函数(或更准确地说,C API等价物)加载代码字符串,该函数编译Lua代码并返回执行它的函数。由于每个语句都是单独加载的,并产生不同的功能,因此它们不会共享局部变量。

基本上,这个控制台输入:

local test = require "test"

print(test)

if test then
    bar()
end

翻译成这个:

(function() local test = require "test" end)()

(function() print(test) end)()

(function()
    if test then
        bar()
    end
end)()

(请注意,这也适用于文件.Lua'文件'实际上只是具有隐式function(...)签名的函数。这意味着您可以从文件的顶层返回,以及对文件上的函数(沙盒等)执行的任何操作。)

如果您要从某处复制代码,可以将代码包围在do ... end中,如下所示:

do
    local test = require "test"
    print(test)
end

do ... end块计为一个语句,并对局部变量进行范围调整。

答案 1 :(得分:1)

在交互式Lua shell中,每个完整语句都以read方式执行。局部变量不能从一个语句存活到另一个语句。