Lua 5.1 程序仅重复提示然后结束,无论我输入什么(使用 Lua 5.1)

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

print("你叫什么名字?")
playerName = io.read()

print("你是男孩还是女孩?")
playerGender = io.read()
repeat
    if playerGender ~= "男孩" and playerGender ~= "女孩" and playerGender ~= "male" and playerGender ~= "female" then
        print("对不起,这不是一个有效的答案。")
        print("你是男孩还是女孩?")
        playerGender = io.read()
    end
until (playerGender == "男孩" or playerGender == "女孩" or playerGender == "male" or playerGender == "female")

无论我输入什么,无论是否是有效的答案,该程序都会响应“对不起,这不是一个有效的答案。你是男孩还是女孩?”。 然后要求您再次输入性别-但无论回答是什么,它都会终止程序,或者它会继续运行其他代码。

我的代码或逻辑有什么问题会使程序以这种方式运行吗?我当前正在使用“重复-如果-然后-结束-否则”块,是否应该使用其他东西? 感谢任何帮助!

点赞
用户1728830
用户1728830

显然,有一个误解关于比较和布尔运算符是如何工作的。以下行将始终评估为true

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

为什么呢?为了更清楚地说明发生了什么,让我们添加一些括号来显示表达式是如何根据操作符优先级进行计算的:

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

这意味着,我们有四个表达式连接着or运算符。也就是说,如果这些子表达式中的任何一个是truthy,整个表达式就是 true。在Lua中,除了 falsenil 的所有值都是 truthy.由于字符串“girl”、“male”和“female”都是truthy,因此整个表达式总是为 true。

以下代码将做到你所想要的:

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

现在,你有四个使用 and运算符连接的表达式,这意味着,所有的子表达式都需要为true(即,所有字符串比较都是不等的)才能使整个表达式为true。

until条件存在相同的问题,即表达式总是 truthy,因为字符串总是 truthy。你可以将循环简化如下:

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
2018-05-20 08:08:01