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
6条答案
按热度按时间rjzwgtxy1#
在1.9中(可能还有以前使用
backports
的版本),你可以很容易地创建枚举器:oknrviil2#
将
Date
存储为示例变量,初始化为Monday。您可以实现一个each
方法,该方法使用date += 7
将存储的日期增加7天。bvk5enib3#
你可以通过延长日期来做些什么...
...当然还有关于扩展基类的常见警告。
kg7wmglp4#
可以使用nw方法 mondays 扩展Date类
默认情况下,Date.mondays将返回从最近的星期一到Date.today的包含10个元素的星期一数组。您可以传递参数:
start_date -查找最近星期一的起始点计数-您要查找的星期一的数量
工业工程师:
62o28rlo5#
...........
r8xiu3jd6#
Ruby 2.7引入了
Enumerator#produce
,用于从任意块创建一个无限枚举器,这导致了一种非常优雅、非常实用的方式来实现最初的问题: