【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"
やったー!