Rubyリファレンス: Home

define_method (Module)

Edit   History

標準クラス・モジュール > Module > define_method

private

define_method(name) {|arg, ...| block }

define_methodメソッドは、クラスやモジュールにメソッドを定義します。defによるメソッド定義を使わずにメソッドを定義できます。引数にはメソッド名を渡し、メソッドの本体はブロックで記述します。

define_methodは渡されたブロックからProcオブジェクトを作成します。戻り値はそのProcオブジェクトになります。

次の例では、Greetingクラスにメソッドcatdogを定義しています。

class Greeting
  { :cat => 'Meow', :dog => 'Bowwow' }.each do |name, message|
    define_method(name) { message }
  end
end
 
puts Greeting.new.dog
Bowwow

define_methodのブロックにブロック引数を加えると、ブロック引数がメソッドの引数になります。

class Greeting
  { :cat => 'Meow', :dog => 'Bowwow' }.each do |name, message|
    define_method(name) {|num| message * num }
  end
end
 
puts Greeting.new.cat(2)
MeowMeow
define_method(name, proc)

define_methodの第2引数にProcMethod、またはUnboundMethodオブジェクトを渡すと、それがメソッドの本体になります。戻り値は第2引数のオブジェクトになります。

class Greeting
end
 
{ :cat => 'Meow', :dog => 'Bowwow' }.each do |name, message|
  proc = Proc.new {|num| message * num }
  Greeting.class_eval { define_method(name, proc) }
end
 
puts Greeting.new.dog(3)
BowwowBowwowBowwow

関連項目