Программа просто повторяет запрос и затем не заканчивает то, что я ввожу (используя Lua 5.1) - PullRequest
0 голосов
/ 20 мая 2018

Я работаю с 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")

Независимо от того, введу ли я один из действительных ответов или это просто случайный тарабарщина - программа отвечает: «Извините, чтоневерный ответ. Ты мальчик или девочка? "Затем вам будет предложено ввести свой пол снова - но независимо от того, какой ответ он просто завершает программу - или он переносит на любой другой код, который нужно запустить.

Что-то не так с моим кодом или логикойчто бы заставить программу вести себя таким образом?Должен ли я использовать что-то еще, кроме блока «repeat - if - then - end - else», который я сейчас использую?Любая помощь будет оценена!

1 Ответ

0 голосов
/ 20 мая 2018

Очевидно, что существует неправильное представление о том, как работают операторы сравнения и логические операторы.Следующая строка всегда будет иметь значение 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
...