如何创造无数可数的时代?
我希望能够让一个对象在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