如何使用交互式 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)
我一般在安装和需要软件包时遇到困难。例如,对于 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)