Очевидно, что существует неправильное представление о том, как работают операторы сравнения и логические операторы.Следующая строка всегда будет иметь значение true
:
playerGender ~= "boy" or "girl" or "male" or "female"
Почему это так?Чтобы прояснить, что происходит, давайте добавим некоторые скобки, чтобы показать, как выражение оценивается в соответствии с приоритетом оператора :
(playerGender ~= "boy") or ("girl") or ("male") or ("female")
Это означает, что у нас есть четыре выражения, связанные с операторами or
,Это означает, что, если любое из этих подвыражений является правдивым, все выражение является истинным.В Lua все значения, кроме false
и 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