重写 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
它。
我正在尝试将 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
它。