【问题标题】:Why isn't Lua reevaluating io.read("*n")?为什么 Lua 不重新评估 io.read("*n")?
【发布时间】:2018-10-04 19:47:20
【问题描述】:

我有一些代码

::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(),代码似乎可以工作

【问题讨论】:

    标签: validation input lua


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-06-12
      • 2018-01-11
      • 2018-05-07
      • 2018-12-07
      • 2014-05-19
      • 2019-05-24
      • 2015-03-15
      • 1970-01-01
      • 2015-08-23
      相关资源
      最近更新 更多