attr_accessorをmix-inの形で作ってみる
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に投げてみようかな。