新井です。

In message "[ruby-list:34457] Re: カレンダー文字列を作るメソッド"
  on 16 Mar 2002 22:18:30 +0900,
  Take_tk <ggb03124 / nifty.ne.jp> wrote:
> たけ(tk)です。
> 
> [ruby-list:34455] Re: カレンダー文字列を作るメソッド にて 
> ABE Shigeru <shiger-a / nifty.com> さん 曰く:
>  エレガントではないと思いますけれども、自分の HP に載せている日記を自
> 動生成させるコードを使って書いてみます。
> 
>  ありがとうございます。day_in_month でいただきました。だいぶすっきりし
> たけれど、まだまだだなぁ・・。each の部分が collect で取れる方法はないも
> のか・・。今話題の inject はこういう用途にはどうなんでしょうか?。

私が書いた場合は、こうなりました。特に何が良いと言うわけでも
ないですが、見栄えと構造は別処理の方がすっきりするように思い
ます。

inject は短く書くための用法で玄人好みだと思いますが、無理に
利用するものでもないと思います。私は bock の処理が小さい(せいぜい
1メソッド呼び出し)なら inject を使いますが、そうでなければ
  result = initval
  ary.each {|i| result << ...}
  result
の形にしそうです。

def calendar_table(year, month)
  weeks = []
  weeks << week = Array.new(7)

  (1..31).each {|day|
    t = Time.local(year, month, day)
    break if t.month != month

    week[t.wday] = day

    if t.wday == 6
      weeks << week = Array.new(7)
    end
  }

  s = sprintf("%12d 年 %d 月\n", year, month)

  weeks.unshift %w(日  月  火  水  木  金  土)

  weeks.collect {|w| sprintf("%4s" * 7, *w) }

end

puts calendar_table(2002,3)