【问题标题】:How to get lua to run sequentially如何让lua按顺序运行
【发布时间】:2013-10-14 19:05:22
【问题描述】:

我正在通过this site 学习 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))

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

"C:\Program Files\Lua\5.1\lua.exe" "Path\To\factorial.lua"

输出(看起来)是空白的,但如果我输入一个数字,函数就会运行。

5
enter a number:
120

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

【问题讨论】:

  • 在程序开始时尝试io.stdout:setvbuf'no'
  • @EgorSkriptunoff 现在似乎可以正常工作了。请随意回答。
  • 你要求的太多了 :-)

标签: io lua buffer


【解决方案1】:

发生的不是代码乱序运行,而是提示没有立即显示到终端。

在内部,您输出的任何内容都由操作系统存储在 IO 缓冲区中。定期清空缓冲区并将其内容显示在终端上(它是flushed)。在大多数系统上,终端默认是行缓冲,这意味着每次你写一个行尾字符 - 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()

请注意,io.write()io.flush() 只是 io.output():write()io.output():flush() 的便利函数,即它们获取当前输出文件,然后对它们调用 :write():flush()

(为什么要为缓冲而烦恼?因为它更快 - 将数据写入终端或文件很昂贵,并且写入一个大的东西比写入很多小东西要快。在大多数情况下,是否无关紧要事情不会在代码运行的那一刻被写入,因此操作系统将要写入的数据保存在缓冲区中,然后在缓冲区填满时进行一次大写。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-13
    • 2018-08-21
    • 2014-12-14
    • 1970-01-01
    • 2018-09-05
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多