如何比较 Ruby 中的月-年组合?

How do I compare month-year combinations in Ruby?

我正在使用 Rails 4.2.7。我有两对数字……

month1   # A number between 1 and 12
year1    # a four digit year
month2   # A number between 1 and 12
year2    # A four digit year

如何编写比较表达式来判断“month2-year2”组合是否大于等于“month1-year1”组合?例如,如果 month2 = 1 且 year2 = 2017 且 month1 = 12 且 year1 = 2016,则 month2-year2 组合大于 month1-year1 组合。

month1, month2, year1, year2 = 12, 1, 2016, 2017
=> [12, 1, 2016, 2017]
Time.new(year1, month1) >= Time.new(year2, month2)
=> false
Time.new(year2, month2) >= Time.new(year1, month1)
=> true

参考:https://ruby-doc.org/core-2.2.0/Time.html#class-Time-label-Creating+a+new+Time+instance

非常简单,无需创建日期或时间对象。

def first_smaller?(ym1, ym2)
  (ym1 <=> ym2) == -1
end

first_smaller? [2016,12], [2017,1]
  #=> true
first_smaller? [2017,1], [2016,12]
  #=> false
first_smaller? [2017,1], [2017,1]
  #=> false

请参阅 Array#<=> 文档的第三段,了解 Ruby 如何排序数组。

如果你还想知道两个数组是否相等,你可以这样写:

def ordering(ym1, ym2)
  case ym1 <=> ym2
end

returns -1 如果 ym1 更小,+1 如果 ym2 更小,或者 0 如果数组相等。