2012-03-04 5 views
0

は、デモ・コードを見て:インスタンス内のクラス変数にアクセスするにはどうすればよいですか?

class A 
    def method_a 
    puts "this is method_a" 
    end 
end 

class B < A 
    def self.hide_method name 
    if instance_methods.include? name 
     @hidden_mthod ||= {} 
     @hidden_mthod[name] = instance_method name 
     undef_method name 
    end 
    end 

    def self.invoke_hidden_methods 
    puts @hidden_mthod.inspect 
    end 

    def bound_method name 
    self.class.class_variable_get(:@hidden_mthod)[name].bind(self) 
    end 
end 

b = B.new 
b.method_a 
B.hide_method :method_a 
B.invoke_hidden_methods 

b.bound_method :method_a **#error** 

b.method_a **#error** 

私がやりたい事は、私はインスタンスメソッドとクラスで定義されて@hidden_​​methodにアクセスする方法をinstance.butに特別な方法を再バインドのですか?

更新日: ありがとう、ボリスストランドジェフ、ウル本当に素敵な男。もし上記のように、私は、コードをよりこのように簡略化されるべきだと思う:

def bound_method name 
    self.class.instance_variable_get(:@hidden_mthod)[name].bind(self) 
end 

これはインスタンス変数ではなく、クラスです。

def bound_method name 
    method_body = self.class.instance_variable_get(:@hidden_method)[name] 
    self.class.send :define_method, name, method_body 
end 
+0

ボリス・ストランドジェフの答えです。それでも、最後のステートメントは実行できません。 – LeoShi

答えて

2
あなた bound_methodに変更

EDITあなたのご意見によると、私はあなたの問題を解決できませんでした。だから私は多くの古代ルビー知識を錆びさせなければならなかった。私はこれを見つけたthread

そして、私はさらにあなたの方法を変更:

def bound_method name 
    puts self.class.instance_variable_get(:@hidden_mthod)[name] 
    metaclass = class << self; self; end 
    metaclass.send(:define_method, name, 
      self.class.instance_variable_get(:@hidden_mthod)[name]) 
end 

基本的bindは、一度のようなインスタンス上でこのメソッドを呼び出すことができるようになります:

self.class.instance_variable_get(:@hidden_mthod)[name].bind(self).call() 

しかし、インスタンスにメソッドを追加しません。 。 :define_methodです。うまくいけば、これはあなたを助けるでしょう。

+0

ありがとうございます。しかし、まだ動作していないようです。 – LeoShi

+0

あなたは間違いを避けようとしていて、あなたの最終目標を無視しています。私は今それを修正しようとします。 –

+0

私が間違っていない場合、あなたが探している解決策が見つかりました。数秒で表示される私の編集を参照してください –

関連する問題