いつも忘れるのでメモ
Rubyでクラスに動的にインスタンスメソッドを定義したい場合、 define_methodというModuleクラスのメソッドを利用する。
インスタンスメソッド name を定義します。 method には Proc、Method あるいは UnboundMethod のいずれかのインスタンスを指定します。 引数 method を与えたときはそれを、ブロック付きで 呼びだしたときはブロックを Proc 化したオブジェクトを、 それぞれ返します。
例えば名前だけ微妙に違う、同じような処理だけど別々のメソッドとしておきたい場合など Railsやっているとしばしばある。
とりあえずサンプル書いてみます
サンプル
class DynamicMethod
# my_method_1, my_method_2というメソッドを定義する
[1,2].each do |num|
define_method("my_method_#{num}") do |message| # 引数message
puts "My method #{num}:#{message} "
end
end
end
dm = DynamicMethod.new
p dm.methods.select{|i| i=~/my_method/} # => ["my_method_1", "my_method_2"]
dm.my_method_1 "hello" # => My method 1:hello
dm.my_method_2 "good-bye" # => My method 2:good-by
# my_method_1, my_method_2というメソッドを定義する
[1,2].each do |num|
define_method("my_method_#{num}") do |message| # 引数message
puts "My method #{num}:#{message} "
end
end
end
dm = DynamicMethod.new
p dm.methods.select{|i| i=~/my_method/} # => ["my_method_1", "my_method_2"]
dm.my_method_1 "hello" # => My method 1:hello
dm.my_method_2 "good-bye" # => My method 2:good-by
うーん、なんて簡単なんだ。
関連記事