自定义日期范围枚举器

时间:2013-12-22 06:42:09

标签: ruby datetime

听起来有点愚蠢。但我正在尝试使用yield关键字来创建自定义循环。

DateRange.new('2013-12-1', '2013-12-31').between do |date|
  puts date
end

应该导致

2013-12-1
2013-12-2
...

DateRange 类看起来像

class DateRange
  attr_accessor :start_date, :end_date

  def initialize(start_date, end_date)
    @start_date = Date.parse(start_date.to_s)
    @end_date = Date.parse(end_date.to_s)
  end

  def between(&block)
    yield (start_date..end_date)
  end    
end

问题是使用自定义块

迭代date_range

2 个答案:

答案 0 :(得分:2)

使用Range#each迭代Range对象,并生成每个项目。

require 'date'

class DateRange
  attr_accessor :start_date, :end_date

  def initialize(start_date, end_date)
    @start_date = Date.parse(start_date.to_s)
    @end_date = Date.parse(end_date.to_s)
  end

  def between(&block)
    (start_date..end_date).each { |x|
      yield x
    }

    #    OR
    # (start_date..end_date).each &block        
  end    
end


DateRange.new('2013-12-1', '2013-12-31').between do |date|
  puts date
end

BTW DateRange.new的第二个参数应该是String。 2013-12-311970

答案 1 :(得分:0)

我能够用

做到这一点
def between(&block)
  (start_date..end_date).map do |date|
    yield date
  end
end