是否可以动态覆盖Ruby中的类方法?
我有一个ErrorHandler
模块,该模块应动态创建一个具有给定名称的类方法,并执行与要覆盖的方法相同的操作:
module ErrorHandler
def self.handle_error_from(method_name)
define_singleton_method(method_name) do |*arguments|
begin
super(*arguments)
rescue
return "Handler return"
end
end
end
end
上述模块是prepended
到另一个模块。
module AnotherModule
prepend ErrorHandler
ErrorHandler.handle_error_from :create
def self.create(params)
# Code here
end
end
上面的示例触发了ErrorHandler,但是它没有使用创建的方法覆盖它。
我已经看到这是通过实例方法完成的,但是当它是类方法时是否有限制?
答案 0 :(得分:1)
您的代码中有一些错误。
在模块中使用$results = collect($results)->first()
和prepend
时,您实际上将在模块上定义包装方法。您可以使用您的代码尝试此操作,并在self
之后添加puts ErrorHandler.methods
,您会看到它已定义了handle_error_from
方法。原因是在这种情况下,自我是create
。
您需要在定义原始方法后定义包装方法。
请参阅此处的完整示例。
ErrorHandler