2016-12-15 3 views
0

私はRedis gemを使用して赤目にアクセスしています。返すハッシュのキーを.hgetallに象徴したいと思います。 this threadでは、@pleternは宝石の_hashifyメソッドにパッチを当てる方法を示しています。Rubyのサブクラスからラムダ変数をオーバーライドする方法は?

これはもう少し前のことですが、現在の実装では、メソッドの代わりにRedisから返されたリストをラムダからHashifyまで使用しています。 See line 2728

は、私は方法のために使用されるものと類似のもの、以下、私の独自の実装で「オーバーライド」に、このラムダをしようとされています:

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 

私はクラスで遊んだことがあり、宝石のHashifyラムダを無効にすることはできませんでした。

+0

リンク先の指定フックを使用して実装しようとしましたか? (例えば、あなたのサブクラスで '_hashify'メソッドを定義していますか?現在の問題は、' Hashify'定数を再定義しようとすると、インスタンス化を制御する能力と関係します。例えば、コードベースのいずれかの部分が 'Redis.new 'あなたのサブクラスをエスケープしておらず、' Hashify'の親クラスの実装に戻る – engineersmnky

+0

私はMyRedis.newを呼び出すだけです。はい、私は_hashifyとno luckを定義しようとしました。 –

+0

あなたが呼んでいることはそれほど重要ではありません。あなたは 'Redis'からすべてのメソッドを継承していますので、例えば' MyRedis :: current'を呼び出すと、これは 'MyRedis'インスタンスではなく' Redis'インスタンスを返します。 – engineersmnky

答えて

2

設定する独自のHashifyあなたのサブクラスが解決しないで、RubyインタプリタがHashify.callがあまりにも、そこに定義されて呼び出す方法としてRedisで定義された定数を使用しますので。

Redis::Hashifyを無効にすることはできますが、これは、あなたのラムダは、すべての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を使用できます。

+0

キーを繰り返すとパフォーマンスが失われますか?私の判断でそれを考慮すべきではないので無視してもいいでしょうか? –

+0

@AlexTurnerこれは、あなたが期待する応答の大きさによって決まります。本当に大きなレスポンスセットを持っていれば、それは十分速くなければなりません。 redis.rbへのプルリクエストを開いて、定数ではなくクラス属性を使用するようにすることもできます。 – tosch

関連する問題