可变范围混乱

时间:2013-09-14 17:09:58

标签: ruby scope

我正在做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

2 个答案:

答案 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循环停止时的结束相同的值。