【发布时间】:2016-12-15 20:54:15
【问题描述】:
我正在使用Redis gem 访问redis,我希望.hgetall 来象征它返回的哈希键。在this thread 中,@pletern 表示猴子修补 gem 的 _hashify 方法的方法。
但是这是不久前的事了,当前的实现使用 lambda 来 Hashify 从 Redis 返回的列表,而不是方法。 See line 2728
我一直在尝试用我自己的实现来“覆盖”这个 lambda,遵循类似的方法:
class MyRedis < Redis
private
Hashify =
lambda { |array|
hash = Hash.new
array.each_slice(2) do |field, value|
hash[field.to_sym] = value
end
hash
}
end
在我的 RedisService 中:
class RedisService
class << self
def hgetall(key)
redis.hgetall("room:"+room_name)
end
private
def redis
@@redis ||= MyRedis.new
end
end
end
我在课堂上玩过,但无法覆盖 gem 中的 Hashify lambda。
【问题讨论】:
-
您是否尝试过使用链接到的帖子中的给定钩子来实现它? (例如,在您的子类中定义
_hashify方法?您当前的问题,尝试重新定义Hashify常量与您控制实例化的能力有关。例如,如果代码库的任何部分调用Redis.new它没有逃出你的子类,会返回Hashify的父类实现@ -
我只调用过 MyRedis.new,是的,我只是尝试定义 _hashify,但没有成功
-
你叫什么并不重要。您正在从
Redis继承所有方法,因此假设您调用MyRedis::current这将返回Redis实例而不是MyRedis实例。
标签: ruby lambda redis symbols monkeypatching