我正在做Chris Pine闰年示例。问题是编写一种方法,告诉你几年内的所有闰年。您向用户询问开始年份和结束年份。
查看提供的答案,我对如何将year
语句中循环的while
变量也添加到语句puts "Check it out...these years are leap years:"
感到困惑。我理解while
循环。我没有看到每年或每个结果如何显示给用户。范围中year
语句中的while
变量不是year
语句中puts
范围内的变量吗?
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
答案 0 :(得分:1)
puts "Check it out...these years are leap years:"
仅在进入循环之前打印初始消息。它不会打印任何年份。year = start
在变量进入循环之前初始化变量year
。puts year
循环内if
循环内的if
循环内的行while
完成,while
循环为在变量year
的范围内,可以访问它。顺便说一下,你引用的答案并不好看。更清洁的解决方案如下:
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?}
答案 1 :(得分:1)
我认为这里的关键是能够理解两件事...... Ruby范围和这一行:year = year + 1
如果范围的概念不清楚,我建议稍微使用谷歌搜索。 “红宝石范围”将是一个良好的开端。
以下是我的想法:
说start
为1,然后我们创建一个名为year
的新变量,我们将其设置为等于start
。所以year
包含1。
year
所在的范围是函数leap_years
的范围,因此在leap_years
声明之后的year
中的所有其他内容都可以更改year
包含。
现在,有了循环。这个while循环与year
的范围相同,while循环中的任何内容都是如此。
所以你开始循环,你就到了year = year + 1
行。我记得当我开始编程时,这种概念让我很困惑。如果年份等于1,我会将其视为“1 = 1 + 1”,这是无稽之谈。
我现在想起那条线......
Set our already-existing variable year equal to the current value of year + 1
因此,如果第一次迭代时年份= 1,则年份现在包含2。
下次我们完成迭代,因为整个leap_years
函数可以引用year
,在while循环年中将包含2,如果满足条件,则年份将打印到屏幕上。 year = year + 1
将再次执行,year
将包含3.所有直到年份都包含与while循环停止时的结束相同的值。