如何创造无数可数的时代?

我希望能够让一个对象在Ruby中扩展Enumerable,成为一个无限的星期一列表(例如)。

所以它会产生:3月29日,4月5日,4月12日……等等

我怎样才能在Ruby中实现它?

在1.9(可能以前的版本使用backports )中,您可以轻松创建枚举器:

 require 'date' def ndays_from(from, step=7) Enumerator.new {|y| loop { y.yield from from += step } } end e = ndays_from(Date.today) p e.take(5) #=> [#, #, #, #, #] 

Date存储为实例变量,初始化为星期一。 您将实现each方法,使用date += 7将存储日期增加7天。

您可以通过延长日期来做某事……


 #!的/ usr / bin中/ruby

要求'约会'

上课日期
   def current_monday
     self  -  self.wday + 1
  结束

   def next_monday
     self.current_monday + 7
  结束
结束

 todays_date = Date.today
 current_monday = todays_date.current_monday
 3次做| i |
   put current_monday.to_s
   current_monday = current_monday.next_monday
结束

 2010-03-22
 2010-03-29
 2010-04-05
 2010-04-12

…当然有关于扩展基类的常见警告。

您可以使用nw方法mondays扩展Date类

 class Date def self.mondays(start_date=Date.today, count=10) monday = start_date.wday > 1 ? start_date - start_date.wday + 8 : start_date - start_date.wday + 1 mondays = [] count.times { |i| mondays << monday + i*7} mondays end end 

Date.mondays将默认返回星期一数组,其中包含从最接近的星期一到Date.today的10个元素。 你可以传递参数:

 Date.mondays(start_date:Date, count:Integer) 

start_date - 开始点找到最接近的星期一计数 - 你正在寻找的星期一的数量

IE:

 Date.mondays(Date.parse('11.3.2002')) Date.mondays(Date.parse('11.3.2002'), 30) 
 module LazyEnumerable extend Enumerable def select(&block) lazily_enumerate { |enum, value| enum.yield(value) if block.call(value) } end def map(&block) lazily_enumerate {|enum, value| enum.yield(block.call(value))} end def collect(&block) map(&block) end private def lazily_enumerate(&block) Enumerator.new do |enum| self.each do |value| block.call(enum, value) end end end end 

………..

 class LazyInfiniteDays include LazyEnumerable attr_reader :day def self.day_of_week dow = { :sundays => 0, :mondays => 1, :tuesdays => 2, :wednesdays => 3, :thursdays => 4, :fridays => 5, :saturdays => 6, :sundays => 7 } dow.default = -10 dow end DAY_OF_WEEK = day_of_week() def advance_to_midnight_of_next_specified_day(day_sym) year = DateTime.now.year month = DateTime.now.month day_of_month = DateTime.now.day output_day = DateTime.civil(year, month, day_of_month) output_day += 1 until output_day.wday == DAY_OF_WEEK[day_sym] output_day end def initialize(day_sym) @day = advance_to_midnight_of_next_specified_day(day_sym) end def each day = @day.dup loop { yield day day += 7 } end def ==(other) return false unless other.kind_of? LazyInfiniteDays @day.wday == other.day.wday end end