Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

メソッドの動的定義で似たメソッドをスマートに定義

似た内容の違う名前なメソッドを定義するケース、結構ありますよね。
こんな時は動的定義が生きてきます。

キモは、次の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

下準備は必要ですが、相当スマートに書く事ができました。