From: ツムジ <the.little.schemer / gmail.com>
Subject: [ruby-list:46396] 高階関数的なメソッドの使い方について
Date: Wed, 16 Sep 2009 23:10:19 +0900

るびきちです。

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

Object#__send__を使えばシンボルで指定したメソッドを呼び出すことができます。

# -*- coding: euc-jp -*-
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

func = [ :triangle, :square, :pentagon]
a = Array.new
3.times do |i|
  a[i] = Array.new
  1.upto(1/0.0) do |j|
    n = j.__send__(func[i])
    break if n > 100
    a[i].push(n)
  end
  a
  # => [[1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91]]
  #    , [[1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91], [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]]
  #    , [[1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91], [1, 4, 9, 16, 25, 36, 49, 64, 81, 100], [1, 5, 12, 22, 35, 51, 70, 92]]
end

--
rubikitch
Blog: http://d.hatena.ne.jp/rubikitch/
Site: http://www.rubyist.net/~rubikitch/
Twit: http://twitter.com/rubikitch/
『Ruby逆引きハンドブック』 http://d.hatena.ne.jp/rubikitch/20090525/rubybook