2012-03-09 7 views
1

私は非常にRubyの新機能で、メタプログラミングについて何かを理解しようとしています。 私は逃したメソッド名戻りたい:内部attr_accessor in method_missing

class Numeric 

    attr_accessor :method_name 

    def method_missing(method_id) 
    method_name = method_id.to_s 
    self 
    end 

    def name 
    method_name 
    end 

end 

10.new_method.name #this should return new_method, but returns nil 

答えて

3

をごmethod_missingmethod_nameローカル変数ではなく、あなたが期待しているmethod_missing=ミューテータメソッドとして解釈されています。あなたが明示的に受信機を追加する場合、あなたは、あなたが望む結果を得るでしょう:

def method_missing(method_id) 
    self.method_name = method_id.to_s 
    self 
end 

を別の方法として、あなたは@method_nameインスタンス変数に割り当てることができます:

def method_missing(method_id) 
    @method_name = method_id.to_s 
    self 
end 

ちょうどそうあなたのための2つのメソッドを追加するマクロattr_accessorattr_accessor :pは、このために簡略化したものです:

def p 
    @p 
end 
def p=(v) 
    @p = v 
end 

あなたが欲しい時に基礎となるインスタンス変数を使用したりする必要があるのは自由です。

+0

ありがとう!それは今、絶対に明らかです – dmitry