程序只是重复提示然后结束,不管我输入什么(使用 Lua 5.1)

Program Just Repeats Prompt and then Ends no Matter what I Input (using 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")

无论如何,无论我输入了有效答案之一还是只是随机乱码 - 程序响应 "I'm sorry, that is not a valid answer. Are you a boy or a girl?" 然后系统会提示你再次输入你的性别 - 但无论答案是什么只是终止程序 - 或者它继续执行 运行.

的任何其他代码

我的代码或逻辑是否有任何错误会使程序以这种方式运行?我应该使用我当前使用的 "repeat - if - then - end - else" 块以外的其他东西吗?如有任何帮助,我们将不胜感激!

显然,对于比较运算符和布尔运算符的工作原理存在误解。以下行将始终计算为 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