是否可以在 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
上面的示例触发了错误处理程序,但它不会使用创建的方法重写它。
我已经看到这是用实例方法完成的,但是当它是类方法时是否有限制?
你的代码中有一些错误。
-
使用模块中的
prepend
和self
,您将在模块上实际定义包装器方法。您可以使用代码尝试此操作,并在handle_error_from
后添加一个puts ErrorHandler.methods
,您将看到它定义了create
方法。原因是在这种情况下,自我是ErrorHandler
的。 -
您需要在定义原始方法后定义包装器方法。
请参阅此处的完整示例。
module ErrorHandler
def handle_error_from(method_name)
define_singleton_method(method_name) do |*arguments|
begin
super(*arguments)
rescue
puts "Handler return"
end
end
end
end
class Foo
extend ErrorHandler
def self.create
raise "error"
end
handle_error_from "create"
end
Foo.create