Tuesday, October 14, 2008

Ruby metaprogramming - create Class Methods

今度はクラスメソッドを生成するメソッド
ポイントはdefine_methodの実行コンテキストをメタクラスにすること

   1  #!/usr/bin/env ruby

   2  # encoding: utf-8

   3  class Creature

   4    def self.atta(arg)

   5      metaclass = class << self

   6        self

   7      end

   8      metaclass.class_eval do

   9        define_method(arg) do |val|

  10          eval("@#{arg}=#{val}")

  11        end

  12      end

  13    end

  14    atta :life

  15  end

  16  

  17  class Dragon < Creature

  18    life 100 # => 100

  19    @life # => 100

  20  end

  21  Dragon.singleton_methods # => ["life", "atta"]

  22  

No comments: