が欲しくなったので、以下のようにした。
class Date def step(limit, step = 1, method = :next_day) unless block_given? return to_enum(:step, limit, step, method) end da = self op = %w(- <= >=)[step <=> 0] while da.__send__(op, limit) yield da da = da.__send__(method, step) end self end end
基本部分は本実装からコピペ。
使用例:20世紀中の日曜日から始まる月を数える。
Date.new(1901, 1, 1).step(Date.new(2000, 12, 31), 1, :next_month).select{ |d| d.sunday? }.count.display
まあつまり、Project Eulerの19問目を解きたかっただけです。
select{ |d| d.day == 1 && d.sunday? } でも良かったんだけど、気分的に「毎月」で回したかった。
これ、DateTime#next_hourとかDateTime#next_secとか作ればそっちにも応用できるし結構便利だと思う。標準で欲しいなぁ。それとも他にもっといい方法があったりするんだろうか。