Onze dagmethode #3: Hash.multi

Geplaatst door Remco van 't Veer do, 07 feb 2008 08:00:00 GMT

Je hebt hem vast wel eens gebruikt Hash.new met een block om een twee-dimensionale hash te maken;


map = Hash.new{|h,k| h[k] = {}}
map[:dragon][:strength] = 9

Maar soms wil je een multi-dimensionale hash;


def Hash.multi
  Hash.new{|h,k| h[k] = Hash.multi}
end

Zelf gebruik ik hem in een applicatie als simpele cache waarvoor ik complexe sleutels heb;


CACHE = Hash.multi

def expensive_query(key)
  cache = CACHE[:query][auth_level][current_channel]
  unless cache.has_key?(key)
    cache[key] = Server.query(auth_level, current_channel, key) 
  else
    cache[key]
  end
end

Geplaatst in ,  | 1 reactie

Reacties

  1. P8 zei ongeveer 7 uur later:

    Cool! Ik wist niet dat je dit kon doen met een Hash en moest toch even uitproberen wat er precies gebeurd (ik dacht eerst dat er een hele grote Hash werd gemaakt):

    def Hash.multi(i=0)  
      puts i
      Hash.new{|h,k| h[k] = Hash.multi(i+1)}
    end
    
    h = Hash.multi
    >> 0
    h['a']['b']['c']
    >> 1
    >> 2
    >> 3
    h['a']['b']['d']
    >> 3
    

(Laat url/e-mail achter »)

   Voorvertoning