2012-01-04 6 views
1

以下のコードを以下のコードに書き換えたいが、私は立ち往生している。ruby​​プログラムの基本的な設計の説明

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 

私はプログラムの主要部分にジャンプしたい任意の後藤があり、ジャンプしたり、私がそのメソッド内でメソッドを呼び出すことができますか?

+0

通常、Rubyは4つではなく2つのスペースでインデントされます。 –

答えて

-1
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 

おかげで、私は私のクリップボードからも最後の時間をそれをコピーしませんでした申し訳ありません。

+0

この再帰的な操作は完全に不要であり、メソッドのセマンティクスも変更しました。 –

+0

Ed.S、これは私の望むものです。しかし、私は彼の答えについてあなたの発言に従っていません。 – Clone

+0

@Clone:これは問題ありませんが、ここでは再帰を使用しています。ループが単純でより明確な場合、あなたのスタックを吹き飛ばす危険性はありません。 –

2

私はプログラムの主要部分にジャンプしたいですが、ジャンプ、ジャンプ、またはそのメソッド内のメソッドを呼び出すことができますか?

はい、これはループと呼ばれ、元のコードで使用しているものです。なぜあなたはループを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 
+0

ありがとうございますが、私は答えを再確認する必要があります。私が 'var.ask'のようなものを呼び出すような方法はありますか? – Clone

+0

@Clone:あなたは何を求めているのかまだ分かりません。 –

1

gotoステートメントがあっても、使用しないでください。それは悪い形であるだけでなく、あなたのプログラムが後に続くのが難しくなるので、メンテナの頭痛を引き起こします。あなたはこのliek何かを試すことができます

# 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 
1

より良いアプローチは、後で使用できる構造に結果を収集、そして、ご質問、有効な回答をするための適切な構造を定義するだけで、それらを反復処理することです。

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

    return reply == 'yes' 
end 
関連する問題