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

attr_accessorをmix-inの形で作ってみる

Ruby
module Sample
  def self.included(base) #:nodoc:
    base.extend(ClassMethods)
  end
  module ClassMethods
    def ya_attr_accessor(object)
      define_method(object) do
        eval("@#{object}")
      end
      define_method("#{object}=") do |obj|
        eval("@#{object}=#{obj}")
      end
    end
  end
end

class Jikken
  include Sample
  ya_attr_accessor :jikken
end

j=Jikken.new
j.jikken=123
puts j.jikken

結果は

% ruby sample.rb
123

うむ。うまくいった。実際はarrayも引数で受けなきゃならないけど、
とりあえず放置。
これってクラスメソッドじゃないの?
って思うのですが、厳密にはわかりません。
extendされたときのタイミングはselfはモジュールなので、
モジュールにメソッドが追加されてしまいます。
これがつまりクラスメソッドとして振る舞うということかなと
勝手に理解しているのですが、MLに投げてみようかな。