程序只是重复提示然后结束无关紧要的输入(使用Lua 5.1)

时间:2018-05-20 06:58:29

标签: lua lua-5.1

我正在使用Lua 5.1。这是我目前正在尝试运行的程序。

print ("What is your name?")
playerName = io.read()

print ("Are you a boy or a girl?")
playerGender = io.read()
repeat
    if playerGender ~= "boy" or "girl" or "male" or "female" then
        print ("I'm sorry, that is not a valid answer.")
        print ("Are you a boy or a girl?")
        playerGender = io.read()
    end
until (playerGender == "boy" or "girl" or "male" or "female")

无论如何,无论我输入其中一个有效答案,还是只是随机乱码 - 程序都会回复#34;对不起,这不是一个有效的答案。你是男孩还是女孩?"然后,系统会提示您再次输入您的性别 - 但无论答案是什么,它只会终止程序 - 或者它会继续运行其他任何代码。

我的代码或逻辑是否会使程序以这种方式运行?我应该使用除了"重复 - 如果 - 然后 - 结束 - 否则"阻止我目前正在使用?任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

显然,对比较和布尔运算符的工作方式存在误解。以下行始终评估为true

playerGender ~= "boy" or "girl" or "male" or "female"

为什么?为了更清楚地说明发生了什么,让我们添加一些括号来显示如何根据operator precedence评估表达式:

(playerGender ~= "boy") or ("girl") or ("male") or ("female")

这意味着,我们有四个与or运算符相关的表达式。这意味着,如果这些子表达式中的任何一个是真实的,那么整个表达式都是正确的。在Lua,all values except for false and nil是真实的。由于所有三个字符串"girl""male""female"都是真实的,因此整个表达式始终为真。

以下将做你想做的事:

(playerGender ~= "boy") and (playerGender ~= "girl") and (playerGender ~= "male") and (playerGender ~= "female")

现在你有四个与and运算符连接的表达式,这意味着所有子表达式都必须为真(即所有字符串比较都是不相等的),整个表达式才为真。

until条件具有相同的问题,即表达式总是真实的,因为字符串总是真实的。您可以按如下方式简化循环:

while playerGender ~= "boy" and playerGender ~= "girl" and playerGender ~= "male" and playerGender ~= "female" do
    print ("I'm sorry, that is not a valid answer.")
    print ("Are you a boy or a girl?")
    playerGender = io.read()
end