为什么 Lua 不会重新评估 io.read("*n")?

我有一些代码

::redo::
io.write("输入:")
var = io.read("*n")
if var then
    if var > 5 and var < 10 then io.write("是的\n") goto redo
    else io.write("无效\n") goto redo end
else io.write("无效\n") goto redo end

这段代码应该检查一个数字输入值,并且如果它在某个范围内就返回。如果它不是一个数字值,它会"重新执行"脚本并要求重新输入。问题在于,每当它接收到一个不是数字的输入值时,它就会不断重复 io.write("输入:")io.write("无效\n"),这意味着它跳过了var = io.read("*n")行。io.read("*n") 有什么特殊含义或怪癖,以使它不会重新评估? 如果将代码替换为io.read()则似乎可以正常工作。

点赞
用户9383219
用户9383219

当你调用 io.read('*n')却没有发现一个数字时,它不会使用输入,并且任何对 io.read('*n') 的调用都会一遍又一遍地读取相同的输入。你需要通过调用 io.read('*l') 消耗掉输入并丢弃它。这将让您能够使用 io.read('*n') 读取新的输入。

另一种方法是使用 io.read('*l') 读取一行,使用 string.match 提取出其中的数字,并使用 tonumber 将其转换为数字。然后您就不必读取相同的输入两次,但是您必须决定要匹配哪些数字表示法(io.read('*n')接受各种数字表示法,包括十六进制和科学计数法)。

2018-10-04 20:43:36