@m_seki の

I like ruby tooから引っ越し

each_slice

Enumerableにeach_sliceってメソッドがあったような気がしてたんだけど、require 'enumerator'が必要だったのね。前回のtoRubyの課題の回答、ERBなんかでHTML化するのに都合がいいように、わざわざ週ごとのループにしてみた。

require 'enumerator'
require 'date'

def cal(y, m)
  head = Date.new(y, m, 1)
  head -= head.wday
  tail = Date.new(y, m, 1) >> 1
  tail += (6 - tail.wday)
  (head..tail).each_slice(7) do |w|
    yield(w.collect {|d| d.month == m ? d.day : nil})
  end
end

t = Date.today
cal(t.year, t.month) do |w|
  puts w.collect {|d| d ? " %2d" % d : " --"}.join("")
end