gpt4 book ai didi

ruby - 如何从 Ruby 中的子类覆盖 lambda 变量?

转载 作者:可可西里 更新时间:2023-11-01 11:13:08 24 4
gpt4 key购买 nike

我正在使用 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

我试过我的类(class),但无法覆盖 gem 中的 Hashify lambda。

最佳答案

在你的子类中设置你自己的 Hashify 没有帮助,因为 Ruby 解释器将使用 Redis 中定义的常量,作为调用 Hashify 的方法.call 也在那里定义。

不过,您可以覆盖 Redis::Hashify。这将导致您的 lambda 被用于所有 Redis 连接和 warning: already initialized constant Redis::Hashify

require 'redis'

Redis::Hashify = lambda do |array|
Hash.new.tap do |hash|
array.each_slice(2) do |field, value|
hash[field.to_sym] = value
end
end
end

请注意,编写会产生警告的代码被许多开发人员认为是糟糕的风格。收到响应后,修改 Redis#hgetall 的响应可能会更好。如果您不介意使用 ActiveSupport,您可以使用它的 Hash#symbolize_keys,例如。

关于ruby - 如何从 Ruby 中的子类覆盖 lambda 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41173173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com