重写 gem 的初始化方法?

Override initialize method of a gem?

我正在尝试将 gem 的初始化方法重写为:

# rails_app_folder/lib/redis/unique/queue.rb

require "redis"

class Redis
  module Unique
    class Queue

      def initialize(name, redis_or_options = {})
        #Custom logic..
      end

    end
  end
end

但是,当我创建一个新实例时 Redis::Unique::Queue.new 会执行 gem 文件夹中的构造函数。

有什么想法吗?

您可以将自定义实现移到单独的模块中,然后 prepend 将其移至 Queue class:

,而不是覆盖该方法
# config/initializers/queue_extension.rb

module QueueExtension
  def initialize(name, redis_or_options = {})
    # Custom logic

    super # <- as needed, invokes the original Redis::Unique::Queue#initialize
  end
end

Redis::Unique::Queue.prepend(QueueExtension)

使用 prepend 将代码放在现有代码的“前面”。

如果此时 Redis::Unique::Queue 不可用,您可能需要 require 它。