Как сравнить пользовательский ввод с парой ключ / значение в хэше в Ruby? - PullRequest
3 голосов
/ 07 июня 2019

Я делаю очень простую программу для викторин, в которой вопросы генерируются случайным образом из хэша, а пользователь вводит их ответ. Я изо всех сил пытаюсь сравнить вводимые пользователем данные с конкретным вопросом и парой ключ / значение. Вот методы, которые я имею до сих пор:

  def generate_question
    @questions = {
      "What is the capital of Japan?" => "Tokyo",
      "What is the capital of Portugal?" => "Lisbon"
    }
    keys = questions.keys
    @question = keys[rand(keys.size)]
    puts @question
    response
  end
  def response
    puts "Please type your answer below"
    @answer = gets.chomp!
    @questions.each do |question, answer|
      if question == @question && answer == @answer
        return "Well done, that's right!"
      else
        return "Not quite right have another go"
      end
    end
  end

Это работает только в 50% случаев. Например, если вопрос «Какая столица Японии?» иногда создается «Токио», а иногда - нет. Был бы очень признателен, если бы кто-нибудь мог помочь мне понять, как сравнить ответ пользователя с правильным вопросом и значение ответа в хэше?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 07 июня 2019

Это происходит потому, что вы перебираете хеш. Чтобы это исправить, используйте переменную экземпляра @question.

def response
    puts "Please type your answer below"
    @answer = gets.chomp!
    correct_answer = @questions[@question]

    if correct_answer == @answer
        return "Well done, that's right!"
    else
        return "Not quite right have another go"
    end
end
1 голос
/ 07 июня 2019

Ваша проблема в этой части

@questions.each do |question, answer|
  if question == @question && answer == @answer
    return "Well done, that's right!"
  else
    return "Not quite right have another go"
  end
end

Если первый вопрос не является вопросом, который был задан, он немедленно вернет, что вы не правы, не глядя на следующий вопрос, потому что возврат возвращается из method не из блока.

Даже если он вернется из блока, хотя он скажет, что вы ошиблись, а затем скажет, что вы правы (если вы правильно ответили на второй вопрос).

Чтобы решить эту проблему, вы можете изменить его на

def response
  puts "Please type your answer below"
  @answer = gets.chomp!
  if @questions[@question].to_s.downcase == @answer.downcase
     "Well done, that's right!"
  else 
     "Not quite right have another go"
  end 
end

Теперь мы ищем ответ на основе вопроса и делаем ответ нечувствительным к регистру

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