объяснение основного дизайна программы ruby - PullRequest
1 голос
/ 05 января 2012

Я хочу переписать следующий код с кодом ниже, но я застрял.

def ask question
good_answer = false
while (not good_answer)
    puts question
    reply = gets.chomp.downcase

    if (reply == 'yes' or reply =='no')
        good_answer = true
        if reply == 'yes'
            answer = true
        else
            answer = false
        end
    else
        puts 'Please answer "yes" or "no"'
    end
end
answer
end

Код замены:

def ask question
    puts question
    reply = gets.chomp
    if (reply == 'yes' or reply == 'no')
        puts reply.capitalize
    else
        puts 'Please enter "yes" or "no"'
        #jump the code to like 2 ( but how?)- use while reply != empty & comment the below lines
        puts question
        reply = gets.chomp
    end
end

Я хочу перейти к основной частиПрограмма есть ли Goto, Jump или я могу вызвать метод внутри этого метода?

Ответы [ 4 ]

2 голосов
/ 05 января 2012

Я хочу перейти к основной части программы, есть ли переход, переход или я могу вызвать метод внутри этого метода?

Да, это называется цикл, то есть то, что вы используете в своем исходном коде. Почему в мире вы хотите заменить цикл на goto? Не имеет смысла.

Однако это можно упростить. Мне не нравится проверка «да» или «нет», но у меня также нет времени на реструктуризацию вашей программы.

def ask question
  while true
    puts(question)
    reply = gets.chomp.downcase
    if reply == 'yes' || reply == 'no'
      return reply == 'yes'
    else
      puts('Please answer "yes" or "no"')
    end 
  end
end
1 голос
/ 05 января 2012

Вы можете попробовать что-нибудь подобное:

def ask_question  
  puts('Please answer "yes" or "no"') until (reply = gets.chomp.downcase) =~ /^(yes|no)$/

  return reply == 'yes'
end
1 голос
/ 05 января 2012

Даже если был оператор goto, вы не должны его использовать.Мало того, что это плохая форма, но это вызывает все виды головной боли для сопровождающих, поскольку ваша программа в конечном итоге становится трудной для следования.

Лучший подход - определить правильные структуры для ваших вопросов и правильных ответов, а затем повторитьэто просто, собирая результаты в структуру, которую вы можете использовать позже:

# Auto-flush output buffer
STDOUT.sync = true

questions = [
  [ 'Is this a good question?', 'yes', 'no' ],
  [ 'Is the sky blue?', 'yes', 'no' ],
  [ 'Do hamsters fly?', 'no', 'yes' ]
]

answers_given = [ ]

questions.each do |question, *answers|
  print question + ' '

  while (true)
    answer = gets

    answer.chomp!

    if (answers.include?(answer))
      puts "Thanks!"

      answers_given << (answer == answers.first)

      break
    end

    puts "You must answer one of #{answers.join(', ')}!"
    print question + ' '
  end
end

questions.each_with_index do |(question, *answers), i|
  puts "#{question} #{answers_given[i]}"
end
0 голосов
/ 05 января 2012
def ask question  
puts question  
reply = gets.chomp.downcase  
if (reply == 'yes' or reply == 'no')  
    puts reply.capitalize  
else  
    puts 'Please enter "yes" or "no"'  
    ask question # this does the looping of loop
end
end  

Спасибо, извините, в прошлый раз я плохо скопировал его из буфера обмена.

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