我想让一个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