3

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

luarocks install inspect

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

local inspect = require 'inspect'

这个检查变量总是nil

require 'inspect'; print(inspect)

返回nil

最初,我不确定它是否正在返回nil,所以当我尝试时,例如,inspect(1)我会收到错误“尝试调用全局 'inspect'(一个 nil 值)”。

使用火炬,我似乎可以成功使用“import 'inspect'”,尽管我不确定为什么它有效并且 require 没有。

我究竟做错了什么?

4

1 回答 1

4

归功于@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)
于 2015-10-15T18:03:24.647 回答