読者です 読者をやめる 読者になる 読者になる

RubyのModule#define_methodとObject#sendを使ってみる

Ruby
class Foo
  def self.createMethod name
    define_method name do
      puts name.to_s
    end
  end
  
  def self.createMethod2 name
    define_method name do |text|
      puts name.to_s + text
    end
  end
  
  createMethod :yes
  createMethod :no
  
  createMethod2 :this
  
end

foo = Foo.new

foo.yes         #=> "yes"
foo.send :no    #=> "no"

foo.this " is a pen."        #=> "this is a pen."
foo.send this, " is a pen."  #=> "this is a pen."

Module#define_methodは動的にメソッドを定義することのできるメソッドです。今回はFooクラス内にyes、no、thisというメソッドを動的に生成しています。

Object#sendはメソッド名を指定してそのメソッドを呼び出すことができます。


動的言語ならではの動作ですね。ちなみにsendメソッドの定義が変更されている可能性がある場合のためにObject#__send__というメソッドもあるようです。

リファクタリングのときに重複を除去するなどに重宝するようですね。

広告を非表示にする