2013-01-17 52 views
-1

我有一個情況,我想能夠調用找到實例中的method_missing

foo.bar.baz arg1,arg2...argn 

有時巴茲不會被定義,我會趕上使用的method_missing但是從method_missing的物體從返回'bar'我希望能夠'foo'。這是我想獲得的對象foo的引用是指

一個解決方案,我可以假設,如果有可能得到調用上下文/父上下文的綁定對象的保持。即從內method_missing方法來獲取綁定對象的保持,因爲它是在呼喚foo.bar

所以我的問題是點,有沒有辦法從在method_missing的,我可以原路返回(在這種情況下富) ?如果我必須在可以解釋的時間內完成呼叫,只要在解釋時完成,而不是使用#extend或其他會嚴重影響緩存/影響性能的內容。

+0

請什麼不明確的評論(使這種潛在的'不是一個真正的question')我有一個非常明確的目標,所以如果目標不明確,一些指針什麼不清楚將是不錯:) –

+0

'我希望能夠得到「foo''is尚不清楚。你想要的方法或由'foo'返回的對象的名稱?從你的評論到sawa它將是foo的接收者? – BernardK

+1

你是掌握還是缺少的'foo'和'bar'方法?在sawa的解決方案中,您可以訪問自己,這是原始接收者。 – BernardK

回答

0
def method_missing *_; self end 
+0

在給出的例子中,將返回什麼'bar'指的是,但我需要什麼'foo'is指的是 –

0
class MyFooClass 
    attr_reader :value 

    def initialize(value) 
     @value = value 
    end 

     # In order to say foo.bar, the class of foo must define bar. 
    def bar 
     puts "bar sent to #{self}" 
      # return a class where method_missing is defined, 
      # and pass it a reference to foo 
     MyBarClass.new(self) 
    end 
end # MyFooClass 

class MyBarClass 
    def initialize(foo) 
     @foo = foo 
    end 

    def method_missing(name, *args, &block) 
     puts "missing #{name} in #{self.class}" 
     self.class.class_eval %Q{ 
      puts "about to define #{name}" 
      def #{name}(*args) 
       puts "in #{name} on self=#{self} with args=#{args}" 
       puts "foo is #{@foo} and it's value is <#{@foo.value}>" 
      end 
     } 
     puts "after define, execute #{name}" 
     self.send(name, *args) 
    end 
end # MyBarClass 

foo = MyFooClass.new('value of foo') # result of an expression 
foo.bar.baz 'arg1' # define baz for future reference and execute it 
print 'MyBarClass.instance_methods : '; p MyBarClass.instance_methods(false) 

執行:

$ ruby -w t.rb 
bar sent to #<MyFooClass:0x10195c750> 
missing baz in MyBarClass 
about to define baz 
after define, execute baz 
in baz on self=#<MyBarClass:0x10195c6b0> with args=arg1 
foo is #<MyFooClass:0x10195c750> and it's value is <value of foo> 
MyBarClass.instance_methods : ["baz", "method_missing"] 
+0

謝謝你的嘗試,但它不會解決我的問題。我無法改變「MyBarClass」和需要重定向消息/方法調用「富」 –