Ruby 模块中的动态覆盖类方法



是否可以在 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

上面的示例触发了错误处理程序,但它不会使用创建的方法重写它。

我已经看到这是用实例方法完成的,但是当它是类方法时是否有限制?

你的代码中有一些错误。

  1. 使用模块中的prependself,您将在模块上实际定义包装器方法。您可以使用代码尝试此操作,并在handle_error_from后添加一个puts ErrorHandler.methods,您将看到它定义了create方法。原因是在这种情况下,自我是ErrorHandler的。

  2. 您需要在定义原始方法后定义包装器方法。

请参阅此处的完整示例。

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

相关内容

  • 没有找到相关文章

最新更新