因为您正在调用,所以导致了无限递归
define_method
在…内
method_added
. 堆栈跟踪(很遗憾,您没有提供)应该显示这一点。
解决这个问题的一个稍微难看的解决方法是显式地设置一个变量(例如。
@_adding_a_method
添加方法(u)
:
module ClassMethods
def method_added(method)
return if @_adding_a_method
if @hooker_before.present? && @methods_to_hook_before.include?(method)
# ...
@_adding_a_method = true
define_method(method_name) do |*args, &block|
# ...
end
@_adding_a_method = false
# ...
end
end
end
然而
Module#prepend
而不是这种元编程?
这段代码让我想起了关于高级元编程技术的Ruby 1.8/1.9教程中的内容;
模块#前置
在大多数情况下,这样的解决办法是多余的。