似た内容の違う名前なメソッドを定義するケース、結構ありますよね。
こんな時は動的定義が生きてきます。
キモは、次のdef_eachメソッドです。
instance_execとブロックを使って格好よく処理します
class Class def def_each(*method_names, &block) method_names.each do |method_name| define_method method_name do instance_exec method_name, &block end end end end
下準備が終わったら自前のクラスを用意、def_eachを反映します。
class MyUnit attr_accessor :state def initialize(state) @state = state end end MyUnit.def_each :power, :speed do |method_name| self.state = method_name end
mu = MyUnit.new(:power) mu.state #=> :power mu.speed #=> :speed mu.state #=> :speed
下準備は必要ですが、相当スマートに書く事ができました。