Почему цикл не хочет продолжаться - PullRequest
1 голос
/ 15 октября 2019

Функция задает вопрос, ответ на который должен быть ДА или НЕТ. Он берет текст вопроса и возвращает букву «у» или «н». У меня есть код Python, мне нужно преобразовать его в Ruby.

#Python code 
def ask_yes_no(question):
    response = None
    while response not in ("y", "n"):
        respone = input(question).lower()
    return response

Что я сделал

# Ruby code
def ask_yes_no(question)

    guessed_it = false
    response = ""

    puts question
    loop do

        unless (response == ("y" || "n"))  || guessed_it

            response = gets.downcase
            return response #&& guessed_it == true

        end

        break if guessed_it == true 
    end
end

ask_yes_no("
How is the weather?")

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

Логика вашего кода на Ruby не такая же, как в версии Python, и в Python будет такой же неправильной, как и в Ruby.

("y" || "n") - логическая операция над двумя строками;поскольку все строки в Ruby имеют значение true, результатом является первая строка. Следовательно, результат всей логической операции также равен true, поэтому unless равно false и блок никогда не вводится.

Вы можете использовать include?, чтобы сделать то же самое, что и версия Python:

unless ["y", "n"].include?(response) || guessed_it

, но вся версия Ruby может быть переведена гораздо проще:

def ask_yes_no(question)
    puts question
    response = nil
    until ["y", "n"].include?(response) do
        response = gets.downcase.strip
    end
    response
end
1 голос
/ 15 октября 2019

Вы также можете использовать регулярные выражения Ruby.

def ask_yes_no(question)

    until (print question; gets.chomp.downcase =~ /y|n/) do
    end

    $~.to_s

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...