输入错误的类型后,如何在一个变量上执行两次“io.read”?

问题描述 投票:2回答:3

Heyo。我对Lua很新(虽然我用Java编写代码),所以我对此一无所知。我基本上试图获取用户的输入,如果它不是正确的类型,那么重新启动。现在,我不确定它是否只是Lua或我的IDE(如果有帮助我使用ZeroBrane Studio),但它不会因任何原因重新输入。 (它只是循环,意味着它会跳过io.read行)

::restart::
...
a = io.read("*number")
if unit == nil then
  print("Error! Incorrect Input!\nRestarting...")
  goto restart
end

哦,是的,我正在使用goto命令重启。我认为这可能是造成这个问题的原因,但我也试过了:

a = io.read("*number") --input non-number
print(a)               --prints
a = io.read("*number") --skips
print(a)               --prints

输入数字时,不会跳过。

你能帮忙的话,我会很高兴。提前致谢。

lua
3个回答
1
投票

我自己解决了这个问题

local a
repeat
  a = io.read(); a = tonumber(a)
  if not a then
    print("Incorrect Input!\n(Try using only numbers)")
  end
until a

0
投票
::restart::
local a = io.read("*n", "*l")
if a == nil then
   io.read("*l")  -- skip the erroneous input line
   print("Error! Incorrect Input!\nRestarting...")
   goto restart
end

附: 每当它使您的代码更容易理解时,请随意使用goto。 例如,在此代码中使用while循环的repeat-until不会使它更好(您需要额外的局部变量或break语句)。


-1
投票

而不是使用io.read()的内置过滤器(我认为有时会被窃听),你应该考虑使用一个自己的小函数来确保用户提供正确的数据。

这是一个功能:

function --[[ any ]] GetUserInput(--[[ string ]] expectedType, --[[ string ]] errorText)
  local --[[ bool ]] needInput = true
  local --[[ any ]] input = nil

  while needInput do
    input = GetData()

    if ( type(input) == expectedType ) then
      needInput = false
    else
      print(errorText)
    end
  end

  return input

end

然后你可以用以下方法调用它:

local userInput = GetUserInput("number", "Error: Incorrect Input! Please give a number.")

哦,并在旁注:Goto被认为是不好的做法。

© www.soinside.com 2019 - 2024. All rights reserved.