せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【Ruby】attr_メソッドが作れたよ~

attr_メソッドを自作しようとしてさんざん挫折している件

前回は、モジュールにクラスメソッド/インスタンスメソッド、
どちらも持ちたい場合はどうすればいいのか分からなかった。

■結論

モジュールにクラスメソッドを定義したい
 ⇒モジュールをextendする

モジュールにインスタンスメソッドを定義したい
 ⇒class_evalでevalする

class_eval、module_evalを使うと、クラスやモジュールの外側でインスタンスメソッドを定義したり、Moduleクラスのprivateメソッドを呼び出したりできます。

http://ref.xaio.jp/ruby/classes/module/class_eval

 
class_evalを使うことによって、
文字列がクラスの地の文として認識される。
よって、定義したメソッドはインスタンスメソッドとして定義される。


■完成コード

module Sekai
  def attr_sekai(attr)
    class_eval <<-EOD
      def #{attr}=(val)
        @#{attr} = val
      end
      def #{attr}
        @#{attr}.upcase
      end
    EOD
  end
end
class Hoge
  extend Sekai
  attr_sekai :name
end

hoge = Hoge.new
hoge.name= "tanaka"
p hoge.name

 
■結果

"TANAKA"


やったー!