如何使用交互式 lua 或火炬会话正确地要求 lua 包?

How to correctly require lua packages using interactive lua or torch session?

我一般在安装和需要软件包时遇到困难。例如,对于 inspect.lua 包,我首先按照包中的说明通过 luarocks 安装 (https://github.com/kikito/inspect.lua):

luarocks install inspect

然后,如果我启动 lua 或 torch7 (th),我将通过以下方式要求它:

local inspect = require 'inspect'

这个检查变量总是 nil:

require 'inspect'; print(inspect)

returns nil.

最初,我不确定它是否返回 nil,所以当我尝试时,例如 inspect(1),我会得到错误 "attempt to call global 'inspect' (a nil value)"。

使用 torch,我似乎可以成功地使用 "import 'inspect'",虽然我不确定为什么这行得通而 require 却不行。

我做错了什么?

发现功劳归于 @siffiejoe

Lua 解释器以块的形式工作。每个块都被视为一个单独的执行集。因此,如果你写:

local a = 5
local b = a

在文件中,它会正确设置b等于5,因为lua文件被视为一个大块。但是,在 REPL 中,第一行局部变量被清除后。

这只是意味着您应该将您的代码强制到一个块中:

do local inspect = require 'inspect'; print(inspect) end

或者使用跨块执行持续存在的全局变量:

$ inspect = require 'inspect'
$ print(inspect)