如果没有成功,我尝试使用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作为返回值打印其值。)
答案 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方式执行。局部变量不能从一个语句存活到另一个语句。