ruby - 确定给定年份是否为闰年

标签 ruby if-statement switch-statement case

更新 我试图解决的问题需要的不仅仅是日期实现,因为它需要一种方法来考虑 1752 年后的格里高利历和 1752 年前的儒略历闰年的不同定义。

以下是我的解决方案,它通过了我所有的 RSpec,并且是对我开始使用的嵌套条件的相当大的改进:

def leap_year?(year)

  gregorian_year = true if year >= 1752
  julian_year = true if year < 1752

  gregorian_test = true if year % 4 == 0 && year % 100 != 0 || year % 400 == 0
  julian_test = true if year % 4 == 0

  case
  when gregorian_year && gregorian_test
    true
  when julian_year && julian_test
    true
  else
    false
  end
end

原始问题

我写了一个简单、丑陋的嵌套条件来实现以下目标:

实现以下目标:

如果年份满足以下条件则返回“true”:

  1. 能被四整除
  2. AND 不是世纪年(例如)1900
  3. 除非它能被 400 整除(例如 400、800、2000)

我写了一个丑陋的嵌套条件:

if year % 4 == 0
  puts "Divisible by four"
  if year % 100 == 0
    puts "Century year"
    if year % 400 == 0
      puts "Quad-century year, leap year"
      true
    else
      "Not a Quad-century year, not a leap year"
      false
    end
  else
    puts "Not a century year, leap year"
    true
  end
else
  puts "Not divisible by four: not a leap year."
  false
end

我试图用一个有条件的案例实现同样的目标,但它未能检测到数字 2016 作为闰年:

case year
when (year % 4 == 0 && year % 100 != 0)
  true
when year % 400
  true
when year % 4 != 0
  false
end

两个问题:

  1. 我在有条件的情况下做错了什么?
  2. 有没有更好的方法来实现这一点?

最佳答案

如果您想确定给定年份是否为闰年,已经在 Date 类中为您实现了 Date#leap?:

Date.leap?(2000)
#=> true

# Or, alternatively:

Date.gregorian_leap?(1900)
#=> false

Date.julian_leap?(1900)
#=> true

Ruby 文档中的更多信息:Date#leap?

如果您无论如何都想自己构建它,这应该可行:

def leap_year?(year)
  return false unless year % 4 == 0
  return true unless year % 100 == 0
  year % 400 == 0
end

leap_year?(2016)
#=> true

关于ruby - 确定给定年份是否为闰年,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44985842/

相关文章:

java - 如何在Java中组合enum、switch和instanceof

ruby - 如何使用 Nokogiri 进行通配符搜索?

Javascript:我正在尝试使用 switch 语句将字符串推送到新数组

ruby - 在 ruby​​ 中创建哈希数组

javascript - JS 三元运算符与 if/else

javascript - 如何捕获输入元素的内容并测试它是否是字母 a-z A-Z 之间的字符,并且两个单词之间有空格

javascript - 带 if 语句的正则表达式

javascript - switch 语句适合多少种情况

ruby-on-rails - Rails - 加入事件记录关系

ruby-on-rails - Rails/Haml 错误 : undefined method `-@' for "":String