인메모리 캐시 생성을 위한 루비 해시 트릭

3406 단어 ruby
이 짧은 게시물에서 저는 여러분에게 계산 결과를 메모리에 메모하는 현명한 트릭을 보여드리고 싶습니다. 때로는 재사용을 위해 여러 작업의 결과를 메모리에 저장해야 하며 일반적으로 Hash 인스턴스를 사용하여 수행됩니다.

예를 들어 Star Wars 캐릭터가 어두운 면에 있는지 여부를 확인하는 메서드가 있다고 가정해 보겠습니다.

def dark_side?(character_name)
  StarWars::Character.find_by(name: character_name).dark_side?      
end


이 메서드는 주어진 입력에 대한 결과를 얻기 위해 DB 쿼리를 실행해야 하기 때문에 무겁습니다. 따라서 동일한character_name으로 여러 번 호출해야 할 필요가 있다는 것을 안다면 다음과 같이 이해하는 것이 좋습니다. 나중에 사용할 수 있도록 결과를 저장합니다.

다음은 결과를 메모화할 수 있는 한 가지 가능성입니다.

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


그러나 RubyHash에는 블록을 전달할 수 있는 멋진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

좋은 웹페이지 즐겨찾기