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
输入数字时,不会跳过。
你能帮忙的话,我会很高兴。提前致谢。
我自己解决了这个问题
local a
repeat
a = io.read(); a = tonumber(a)
if not a then
print("Incorrect Input!\n(Try using only numbers)")
end
until a
::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
语句)。
而不是使用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被认为是不好的做法。