読者です 読者をやめる 読者になる 読者になる

Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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

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

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

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