define_methodとは
define_methodとは、簡単に言うとメソッドを動的に定義できるメソッドです。
これに関しては、言葉より実際に処理を見た方が理解できるかと思います。
基本的な使い方
第1引数にはメソッド名
、第2引数に処理内容
を記述します。
class Foo
def foo
p 'foo'
end
define_method(:bar, instance_method(:foo))
end
# barを直接定義しなくてもメソッドのように使えている
Foo.new.bar #=> "foo"
第2引数の代わりにブロックを渡すことも可能
# wordには「foo」「bar」「baz」がそれぞれ入る
%w(foo bar baz).each do |word|
define_method :word do |i = nil|
# iがtrueの場合は、i + 1、falseの場合はメソッド名を返す
i ? i + 1 : word
end
end
puts foo #=> "foo"
puts bar(2) #=> 3
puts baz #=> "baz"
まとめ
動的メソッドを使うことで、コードの重複を無くすことが可能なので、タイミングを見て活用することも一つの手段ですね!