1

私はChris Pine Leap Year Exampleをやっています。問題は、ある範囲のうるう年をすべて教えてくれるメソッドを書くことです。ユーザーに開始年と終了年を尋ねます。

year提供された回答を見ると、ステートメントでループされている変数がどのようにwhileステートメントに追加されているかについて混乱していますputs "Check it out...these years are leap years:"whileループが分かります。毎年または結果がユーザーにどのように表示されているかわかりません。ステートメント内の変数とは別のスコープ内のステートメント内のyear変数ではありませんか?whileyearputs

def leap_years
  puts "Starting Year?"  
    start = gets.chomp.to_i

  puts "Ending Year?"
    ending = gets.chomp .to_i

  puts "Check it out...these years are leap years:"
    year = start #year is now = to the start, but how is it getting fed each year from the while loop?

while year <= ending
    if year%4 == 0
      if year%100 != 0 || year%400 == 0
        puts year
      end
    end
    year = year + 1
  end 

end
4

2 に答える 2

1
  • puts "Check it out...these years are leap years:"ループに入る前に最初のメッセージを出力するだけです。何年も印刷されていません。
  • year = startyearループに入る前に変数を初期化します。
  • ループ内の別のループ内のputs yearループ内の行によって毎年の印刷が行われ、ループは variable のスコープ内にあり、それにアクセスできます。ififwhilewhileyear

ちなみに、あなたが引用した回答は見栄えがよくありません。よりクリーンなソリューションは次のとおりです。

class Fixnum
  def leap_year?
    return true  if modulo(400).zero?
    return false if modulo(100).zero?
    return true  if modulo(4).zero?
    return false
  end
end

puts (start..ending).select(&:leap_year?)

または、より効率的に:

(start..ending).each{|i| puts i if i.leap_year?}
于 2013-09-14T17:32:51.530 に答える
1

ここで重要なのは、Ruby スコープと次の 2 つのことを理解できることだと思います。year = year + 1

スコープの概念が不明な場合は、少しグーグルすることをお勧めします。「ルビースコープ」は良いスタートです。

これが私がそれについて考える方法です:

は 1 と言うstartので、という名前の新しい変数を作成し、それをyearに等しく設定しstartます。したがってyear、1 が含まれます。

year存在するスコープは関数のスコープであるため、の宣言の後にあるleap_years他のすべてのものは、含まれるものを変更できます。leap_yearsyearyear

さて、その while ループがあります。この while ループは、while ループ内にあるものと同様に、 と同じスコープyear内にあります。

それで、ループを通り始めて、行にたどり着きますyear = year + 1。私がプログラミングを始めたとき、この種の概念が私を本当に混乱させたのを覚えています。年が 1 の場合、「1 = 1 + 1」と読みますが、これはナンセンスです。

私は今、その行を次のように考えるでしょう...

Set our already-existing variable year equal to the current value of year + 1

したがって、最初の繰り返しで year = 1 の場合、year には 2 が含まれます。

leap_years関数全体が を参照できるため、次に反復を実行するyearと、while ループで year に 2 が含まれ、条件が満たされた場合は year が画面に出力されます。all until year には、while ループが停止する終了時点と同じ値が含まれますyear = year + 1year

于 2013-09-14T17:50:13.907 に答える