我想讓一個Foo
的實例執行一些方法或過程(不管),如果它或它的foo_instance
知道它。 foo_instance
是Foo
的一個實例,它定義了一些方法。我想,那個時候的Foo
另一個實例不響應一些方法,如果foo_instance
確實,它將在它的實例執行PROC:method_missing結合instance_exec的奇怪行爲(ruby)
class Foo
attr_accessor :foo_instance # this is an instance of Foo
def get_proc(symbol)
# ... a method that gets a proc (it has nothing to do with to_proc, and it is not binded to any thing, it only gets the code (as I'm only allowing to define new methods or accessors not directly, it doesn't matter)
end
def method_missing(symbol, *args, &block)
throw NoMethodError unless self.foo_instance.respond_to? symbol
some_proc = self.foo_instance.get_proc symbol
self.instance_exec args, &some_proc
end
end
例如,假設foo_instance響應一些所謂foo_method
方法,這需要一個參數,它應該是一個數字。並假設,即,當我們定義foo_method
:
self.define_singleton_method :foo_method, & proc {|a| a + 1}
這就是我結識了PROC與get_proc
,當我定義的方法,我把它保存在一個變量。反正:
another_instance = Foo.new
another_instance.foo_method(1) # it goes to method_missing
當它到達method_missing
,通過調試我發現,args
是[1]
,並且它的作用:
self.instance_exec [1], proc { 'foo' }
,當然還有:
TypeError: no implicit conversion of Fixnum into Array
的問題是:我究竟做錯了什麼?由於instance_exec
或method_missing
應該收到1
,而不是[1]
,而且我也沒有發送數組!我認爲這可能是因爲*args
,因爲它可能是一個參數數組,但我不確定。我無法讓它工作。
你塊試圖返回字符串''foo''?我無法在這裏重現問題。你能想出一個你想在這裏做什麼的最簡單的例子嗎? – tadman