1

我刚刚学习 Lua,我的书(Lua 编程)中有一些代码“读取文件的前 10 行:”

a = {}
for i=1,10 do
    a[#a+1] = io.read()
end

这对我来说真的没有任何意义。这不是读取十个零值吗?有人可以解释一下吗?

4

1 回答 1

3

简短版本:归结为是否io.input在您的问题中未列出的代码中较早地调用过。如果它被调用,它将打印该文件的前 10 行(下面将详细解释)。如果之前没有调用它并且您是从命令行运行或以交互方式运行,那么一旦代码执行,它将打印您在控制台中键入的前 10 行。对于其他情况,这仅取决于应用程序的启动方式。

Lua 5.1参考手册io.read说如下:

io.read (···)

等效于 io.input():read。

并且文档io.input说:

当使用文件名调用时,它会打开命名文件(以文本模式),并将其句柄设置为默认输入文件。当使用文件句柄调用时,它只是将此文件句柄设置为默认输入文件。当不带参数调用时,它返回当前的默认输入文件。[...]

file.readfile作为调用返回的对象)的文档io.input()说:

根据给定的格式读取文件file,指定要读取的内容。对于每种格式,该函数返回一个字符串(或一个数字),其中包含已读取的字符,如果无法读取指定格式的数据,则返回 nil。当不带格式调用时,它使用读取整个下一行的默认格式 [...]

所以这里有两种可能:

  • io.input之前使用参数(您的问题中未显示一些代码)调用,设置默认输入文件。不带参数的调用io.read将返回该输入文件的“默认格式”,即“整个下一行”。
  • io.input之前没有使用参数调用(如果没有其他代码,在您的情况下是这样)。不带参数的调用io.read将返回标准输入的“整个下一行”,例如如果程序从命令行运行,则返回用户的命令行输入。

在第一种情况下,nilio.read()在读取完文件的所有行后返回。这可能意味着 10 个读取实例nil,但这取决于文件。

在第二种情况下,nil如果标准输入用尽,将返回,这可能以不同的方式发生,具体取决于应用程序的启动方式。这也可能意味着 10 个nil.

于 2012-09-30T23:50:20.217 回答