【发布时间】:2017-07-08 11:42:23
【问题描述】:
更新我试图解决的问题需要的不仅仅是 Date 实现,因为它需要一种方法来同时考虑 1752 年之后的公历和 1752 年之前的儒略历闰年的不同定义。
以下是我的解决方案,它通过了我所有的 RSpecs,并且对我开始使用的嵌套条件进行了相当大的改进:
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”:
- 能被四整除
- AND 不是世纪年(例如)1900
- 除非它可以被 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
我尝试使用 case 条件来达到同样的效果,但它未能将数字 2016 检测为闰年:
case year
when (year % 4 == 0 && year % 100 != 0)
true
when year % 400
true
when year % 4 != 0
false
end
两个问题:
- 在有条件的情况下我做错了什么?
- 有没有更好的方法来实现这一点?
【问题讨论】:
-
更新了答案以包括
Date#gregorian_leap?和Date#julian_leap?。请记住,不同国家/地区在不同年份将儒略历转换为公历。 -
请不要在问题中包含答案(即您的“更新”)。如果您有解决方案,请将其作为答案单独发布。 (这在 SO 上经常看到。)读者喜欢中肯、清晰和简洁的问题。然后他们可能会查看答案,添加评论或答案,或者只是继续下一个问题,但他们不会不想浪费时间在问题本身中研究无关的材料。查看有多个赞成票的问题,并注意它们的共同特征。
-
你的问题,因为它包含工作代码,更适合 SO 的姊妹站点 Code Review,在那里你会得到关于如何改进你的代码的建议。 SO 的任务是帮助修复损坏的代码并提出解决问题的方法。
标签: ruby if-statement switch-statement case