我正在尝试运行此代码来覆盖each
Array 实例:
my_array.define_singleton_method(:each, &block) do
super { |x| x.instance_exec(&block) }
end
问题是我收到此错误both block arg and actual block given (SyntaxError)
,因为我给了两个块参数define_singleton_method
如果我需要一个用于方法定义的块,那么如何each
在使用块时重新定义?each
您的问题是将其
&block
作为显式参数传递define_singleton_method
,并传递隐式块。您实际上想要做的是将其
&block
作为新方法的参数捕获each
,以便可以将该块传递下去。本质上
define_singleton_method
看起来像这样:因此,您可以按照如下方式实现您的目标:
这基本上等同于
唯一的区别是
def...end
方法声明允许隐式参数传递,如图所示,而define_singleton_method
不允许,所以我们必须捕获块并明确将其传递给super
。