【问题标题】:Cannot import module with Lua, results in attempt to index global 'test' (a nil value)无法使用 Lua 导入模块,导致尝试索引全局“测试”(零值)
【发布时间】:2014-07-23 11:10:34
【问题描述】:

没有成功,我尝试使用 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 = 要求 "test" 值为 nil。

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

想法? (注意:我通常还需要该文件,但没有将其分配给局部变量,并以 nil 作为返回值再次打印其值。)

【问题讨论】:

  • 把你的代码放在这里。我们不能心灵感应。
  • 更新了,又是一开始就炸了。

标签: lua importerror


【解决方案1】:

扩展 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 'files' 实际上只是带有隐式 function(...) 签名的函数。这意味着您可以从文件的顶层返回,以及执行您的任何操作也可以对文件执行功能(沙盒等)。)

如果您从某个地方复制代码,您可以将代码括在do ... end 中,如下所示:

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

do ... end 块计为一个语句,并作用于局部变量。

【讨论】:

【解决方案2】:

在交互式 Lua shell 中,每个完整的语句都以读取方式执行。局部变量不能从一个语句保留到另一个语句。

【讨论】:

  • 好吧,当我使用 Lua4Crypto 时,我可以 -- local crypto = 需要 "crypto" 并在该变量上调用方法而没有错误。 Lua4Crypto 是用 luarocks 安装的,所以很明显我误解了如何将我自己的文件导入到交互式 Lua shell 和我的 Lua 脚本中。 (>.
  • @LorenaNicole,在您的第三个示例中,尝试删除 local。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-21
  • 2014-01-26
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
相关资源
最近更新 更多