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

时间:2020-06-26 08:30:26

标签: ruby inheritance prepend

是否可以动态覆盖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,但是它没有使用创建的方法覆盖它。

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

1 个答案:

答案 0 :(得分:1)

您的代码中有一些错误。

  1. 在模块中使用$results = collect($results)->first() prepend时,您实际上将在模块上定义包装方法。您可以使用您的代码尝试此操作,并在self之后添加puts ErrorHandler.methods,您会看到它已定义了handle_error_from方法。原因是在这种情况下,自我是create

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

请参阅此处的完整示例。

ErrorHandler