1

我正在做 Chris Pine 闰年示例。问题是编写一个方法来告诉你一个年份范围内的所有闰年。您向用户询问开始年份和结束年份。

查看提供的答案,我对语句year中循环的变量如何while也被添加到语句感到困惑puts "Check it out...these years are leap years:"。我理解while循环。我没有看到每年或结果如何显示给用户。year语句中的变量不是与while语句中的变量分开的yearputs

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

我认为这里的关键是能够理解两件事......Ruby范围和这一行:year = year + 1

如果范围的概念不清楚,我建议您搜索一下。“红宝石范围”将是一个好的开始。

以下是我的想法:

start是 1,所以我们创建一个名为的新变量year并将其设置为等于start。所以year包含 1。

存在的范围year是函数的范围,因此在声明之后的leap_years所有其他内容都可以更改包含的内容。leap_yearsyearyear

现在,有那个while循环。year此 while 循环与 while 循环内的任何内容都位于相同的范围内。

因此,您开始遍历循环并到达该行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 打印到屏幕上。year = year + 1将再次执行,year然后将包含 3。所有直到 year 包含与 while 循环停止时结束时相同的值。

于 2013-09-14T17:50:13.907 回答
1
  • puts "Check it out...these years are leap years:"只是在进入循环之前打印初始消息。它没有印刷任何年份。
  • year = start在变量year进入循环之前对其进行初始化。
  • 每年的打印是由循环内的另一个循环内的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 回答