メモリ内キャッシュを作成するためのRubyハッシュトリック


この短いポストでは、メモリ内の計算結果を記憶するためのスマートトリックをお見せしたいと思います.場合によっては、再利用のためにメモリに複数の操作の結果を格納する必要があり、典型的にはHash インスタンス.
例えば、スターウォーズ文字が暗い側からのかどうかをチェックするためのメソッドがあるとしましょう.
def dark_side?(character_name)
  StarWars::Character.find_by(name: character_name).dark_side?      
end
このメソッドは重いので、与えられた入力の結果を得るためにDBクエリを実行する必要があるので、何度も呼び出す必要があるかもしれませんcharacter_name 将来の使用のために結果を格納することは意味があるかもしれません.
ここで結果をどのように記述できるかの1つの可能性があります.
def dark_side?(character_name)
  @dark_side_cache ||= {}

  @dark_side_cache[character_name] = StarWars::Character.find_by(name: character_name).dark_side? unless @dark_side_cache.key?(character_name)      

  @dark_side_cache[character_name]
end
しかし、ルビーのHash 良いですconstructor ブロックを渡すことのできるバリアント.
このソリューションをチェックアウト、それは純粋なルビーの美しさではないか.💅
def dark_side?(character_name)
  @dark_side_cache ||= Hash.new do |hash, char_name|
    hash[char_name] = StarWars::Character.find_by(name: char_name).dark_side?
  end
  @dark_side_cache[character_name]
end