我正在使用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;对不起,这不是一个有效的答案。你是男孩还是女孩?"然后,系统会提示您再次输入您的性别 - 但无论答案是什么,它只会终止程序 - 或者它会继续运行其他任何代码。
我的代码或逻辑是否会使程序以这种方式运行?我应该使用除了"重复 - 如果 - 然后 - 结束 - 否则"阻止我目前正在使用?任何帮助将不胜感激!
答案 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