如何让lua顺序运行

Dav*_*key 8 io lua buffer

我正在通过这个网站学习Lua .我在教程的最开始,我正在尝试这个程序(输入一个数字x,它返回x!):

-- defines a factorial function
function fact (n)
  if n == 0 then
    return 1
  else
    return n * fact(n-1)
  end
end

print("enter a number:")
a = io.read("*number")  -- read a number
print(fact(a))
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,io.read似乎在提示之前.我在Notepad ++控制台中运行它,如下所示:

"C:\Program Files\Lua\5.1\lua.exe" "Path\To\factorial.lua"
Run Code Online (Sandbox Code Playgroud)

输出(看似)是空白但如果我输入一个数字,则该功能运行.

5
enter a number:
120
Run Code Online (Sandbox Code Playgroud)

虽然这不是一个很大的问题,但我只能想象在创建之前使用的变量所带来的问题.那么,在阅读输入之前,如何让这个程序提示输入数字呢?

Tox*_*rog 13

发生的事情不是代码乱序,而是提示没有立即显示给终端.

在内部,您输出的任何内容都由操作系统存储在IO缓冲区中.定期清空缓冲区,并在终端上显示其内容(刷新).在大多数系统中,默认情况下终端是行缓冲的,这意味着每次你写一个行尾字符 - 它print()会自动执行 - 它会被刷新; 但是,在某些系统上,它默认为完全缓冲,这意味着它只在填满时自动刷新.

有两种方法可以解决这个问题.如果要为文件上的所有 IO操作禁用或更改缓冲(为了这些目的,终端计为文件),您可以使用该file:setvbuf()功能; 特别是,io.output():setvbuf("no")将禁用标准输出的缓冲,这意味着您写的任何内容都将立即显示.您还可以io.output():setvbuf("line")在支持但不支持默认的系统上启用行缓冲.

另一种方法是手动刷新缓冲区,这在您希望立即显示某些特定输出时非常有用,但不希望普遍禁用输出缓冲.您可以使用该file:flush()函数执行此操作,该函数会立即刷新缓冲区,例如:

-- no newline, so even on line-buffered systems this may not
-- display immediately
io.write("Enter a number: ")
-- so we force it to
io.flush()
Run Code Online (Sandbox Code Playgroud)

请注意,io.write()io.flush()只是为了方便功能io.output():write()io.output():flush(),即他们得到的电流输出文件,然后打电话:write():flush()上他们.

(为什么要轻松缓冲?因为它更快 - 将数据写入终端或文件是昂贵的,写一个大的东西比写很多小东西要快.在大多数情况下,如果事情不重要就没关系在代码运行的瞬间写入,因此操作系统将要写入的数据保存在缓冲区中,然后在缓冲区填满时进行一次大写操作.)