0

1 = January、 など、1 から 12 までの各数字が何月を表すかを示すアプリを作成しています2 = February。これが初期コードです。

print "Please, tell me the month's number!"
number = gets.chomp.to_i
while number > 12  do
    print "Please, re-type it again!"
    number = gets.chomp.to_i
end
case number
    when 1 then print "This is January!"
    when 2 then print "This is February!"
    when 3 then print "This is March!"
    when 4 then print "This is April!"
    when 5 then print "This is May!"
    when 6 then print "This is June!"
    when 7 then print "This is July!"
    when 8 then print "This is August!"
    when 9 then print "This is September!"
    when 10 then print "This is October!"
    when 11 then print "This is November!"
    when 12 then print "This is December!"
    else print "I can't undestand you, i'm sorry!"
end

これで、基本的なロジックが設定されました。欠けていると私が思う唯一のことは、while ループの 2 番目の条件です。これは、入力が整数でない場合、再入力する必要があることを定義しています。そのwhileループで2番目の条件を正しく定義しようとしていますが、これまでのところ結果はありません。どうすればいいですか?

どうすればコードを改善できますか? そしてwhile、このコンテキストでのループは、仕事に適した方法ですか?

4

5 に答える 5

2

コードを改善する別の方法を次に示します。

require 'date'
print "Please, tell me the month's number! "
number = gets.to_i
until number.between?(1,12) do
  print "Please, re-type it again! "
  number = gets.to_i
end
month_name = Hash.new
(1..12).each do |month_num|
  month_name[month_num] = Date::MONTHNAMES[month_num]
end
print "This is #{month_name[number]}!"

他の回答で述べたように、整数に変換すると新しい行が処理されるためchomp、使用する場合は必要ありません。入力が有効かどうかを確認するために、@steenslag の提案に従ってto_i使用しています。number.between?(1,12)

caseステートメントの代わりにハッシュアプ​​ローチを試みました。ループはこれwhileを行う 1 つの方法ですが、これはそれを行う別の方法にすぎません。

于 2013-05-30T18:46:20.407 に答える
1
print "Please, tell me the month's number!"
number = gets.to_i

数値の性質上、行末がないことが示されているため、chomp使用する場合は必要ありません。to_i

until number > 1 && number < 12  do

数字は 1 から 12 まで含めたいですよね?

あなたは代わりにこれを行うことができます、

until (1..12).include?(number) do

または@teenslagが述べているように、

until number.between?(1, 12) do

どちらも読みやすく、between?メソッドの方が良い選択かもしれません。

    print "Please, re-type it again!"
    number = gets.to_i
end

前述のように、これは非常に DRY であるか、組み込みの Date オブジェクトを使用している可能性があります。しかし、同じ精神で、あなたが持っているコードで何ができるか見てみましょう:

case number
    when 1 then print "This is January!"
    when 2 then print "This is February!"
    when 3 then print "This is March!"
    when 4 then print "This is April!"
    when 5 then print "This is May!"
    when 6 then print "This is June!"
    when 7 then print "This is July!"
    when 8 then print "This is August!"
    when 9 then print "This is September!"
    when 10 then print "This is October!"
    when 11 then print "This is November!"
    when 12 then print "This is December!"
end 

これに変わります:

answer = case number
         when 1
           "January"
         when 2
           "February"
         when 3
           "March"
         when 4
           "April"
         when 5
           "May"
         when 6
           "June"
         when 7
           "July"
         when 8
           "August"
         when 9
           "September"
         when 10
           "October"
         when 11
           "November"
         when 12
           "December"
         end
print "This is #{answer}!"

Date クラスを使用するだけでよいのですが。

それが利用できない場合は、代わりにここでハッシュを使用することを検討してください。これらのオプションを検討させていただきます。

または配列。配列要素は位置 0 から始まることに注意してください。

print "Please, tell me the month's number!"
until (number = gets.to_i).between?(1,12) do
    print "Please, re-type it again!"
end
months = %w[January February March April May June July August September October November December]
puts "This is #{months[number - 1]}!"
于 2013-05-27T07:31:00.623 に答える
0

上記の投稿者が述べたように、この特定のインスタンスには 2 番目の条件は必要ありません。ただし、ループ中に複数の条件が必要な場合は、論理 AND または論理 OR 演算子を使用します。

論理 AND 演算子は&&です。論理 OR 演算子は||です。&&ループを続行するには、両方の条件が真である必要がある場合に使用します。||ループを続行するには、どちらか一方が true である必要がある場合に使用します。

例えば:

while number > 12 || number == 0 do
    stuff...
end

while number > 0 && number < 13 do
    stuff...
end

最初のスニペットでは、入力された数値が 12 より大きいか 0 に等しい場合にループに入ります。2 番目のスニペットでは、入力された数値が 0 より大きく 13 より小さい場合にループに入ります。ここで while ループを使用していたのとは正反対ですが、デモ用に含まれています)。

于 2013-05-27T02:27:20.610 に答える
0

必要な単純なループ:

until month_num > 0 && month_num < 13 do
 # prompt again
end

より慣用的な方法は、の間で使用することでしょうか? または含めますか?

until month_num.between? (1, 12) do
  # prompt again
end

multiple の代わりにwhen then、Date モジュールのハッシュ マップを使用できます。Date::MONTHNAMES[month_num]

于 2018-10-14T08:33:16.417 に答える