最近、Project Euler の問題を Ruby を使って解いているのですが、その時に
ちょっと疑問に思ったことがあったので、メールしてみました。

実際の Project Euler の問題は少し込み入っているので、内容を単純化した
もので例を示してみます。

例えば次のようなコードがあるとします。

class Integer
  def triangle                  # 三角数
    return (self + 1) * self / 2
  end
  def square                    # 四角数
    return self * self
  end
  def pentagon                  # 五角数
    return (3 * self * self - self) / 2
  end
end

ここで、a[0]、a[1]、a[2] にそれぞれ 100 以下の三角数、四角数、五角数を
集めていくとします。

同じような処理を繰り返したくないので、 Integer#triangle、
Integer#square、Integer#pentagon をブロックで包んでオブジェクト化して使
うことを考えました。

func = [lambda{|x| x.triangle},
        lambda{|x| x.square},
        lambda{|x| x.pentagon}]
a = Array.new
3.times do |i|
  a[i] = Array.new
  1.upto(1/0.0) do |j|
    n = func[i].call(j)
    break if n > 100
    a[i].push(n)
  end
end

このコードでしっかり目的は達成できるのですが、ちょっと気になることがあ
ります。

もともと func[0], func[1], func[2] はブロックをオブジェクト化したもので
した。それをまたブロックで包んで使用するのは、ちょっとすっきりしない気
がします。でも、"lambda" を使うにはブロックの形でメソッドを渡す必要があ
るので、今回はこの形にしました。

今回私がとった方法以外に、高階関数のようにメソッドをうまく使う方法はな
いのでしょうか?

追記:
ちなみに、実際に Project Euler を解いたときのコードは
<http://tsumuji.cocolog-nifty.com/tsumuji/2009/09/project-euler-1.html>
に書いてあります。