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

时间:2018-10-04 19:47:21

标签: validation input lua

我有一些代码

::redo::
io.write("input: ")
var = io.read("*n")
if var then
    if var > 5 and var < 10 then io.write("yes\n") goto redo
    else io.write("invalid\n") goto redo end
else io.write("invalid\n") goto redo end

应该检查数字输入值并返回它是否在一定范围内。如果不是数字值,则应该“重做”脚本并再次要求输入。问题是,只要输入的内容不是数字,就会不断重复io.write("input: ")io.write("invalid\n"),这意味着它会跳过var = io.read("*n")行。 io.read("*n")是否有特殊含义或怪异之处,可避免重新评估?如果将代码替换为io.read()

,该代码似乎可以正常工作

1 个答案:

答案 0 :(得分:0)

当您呼叫io.read('*n')并且找不到数字时,它不会用完输入,并且对io.read('*n')的任何调用都会一遍又一遍读取相同的输入。您需要吃掉输入并通过调用io.read('*l')放弃它。这样一来,您就可以使用io.read('*n')阅读新输入。

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