2013-03-11 13 views
5

Ho un numero di oggetti Ruby con ID univoci che attualmente sto memorizzando nella cache di un hash. Quando a un oggetto viene assegnato un ID, esso entra nell'Hash. La cache è completa, vale a dire che ogni oggetto con un ID che esiste nell'ambito di Ruby dovrebbe essere anche nella cache.Ruby object cache

Tuttavia, ho difficoltà a trovare un modo per eliminare gli oggetti dalla cache una volta che scompaiono da tutti gli altri ambiti. Questo è, naturalmente, perché gli oggetti contenuti nella cache non saranno raccolti.

Ci sono approcci a questo problema? La documentazione per WeakRef suggerisce una classe WeakHash, ma non sembra accettabile per l'uso pratico, sebbene sia molto vicina a ciò che penso di cui ho bisogno per il mio progetto.

+1

Perché Non sarebbe pratico? –

+1

WeakRef è ciò di cui hai bisogno. – Linuxios

risposta

3

Qualcosa di simile a WeakHash lo farà. Ecco un'implementazione più completa in grado di gestire Fixnums, simboli, e Galleggianti (e di altri tipi immutabili se li si aggiunge alla lista):

class WeakHash < Hash 
    def []=(k, v) 
    if(![Fixnum, Symbol, Float].include? k.class) 
     k = WeakRef.new(k) 
    end 
    if(![Fixnum, Symbol, Float].include? v.class) 
     v = WeakRef.new(v) 
    end 
    super k,v 
    end 
end 
+0

Questo è molto simile all'esempio fornito nella documentazione di WeakRef, ma non c'è una perdita di memoria qui? Gli oggetti archiviati in questo hash sono in effetti raccolti inutili, ma 'weakhash.count' non diminuisce mai. è una cosa negativa? – Vortico

+0

@Vortico: non una perdita di memoria. Bene, bene, una perdita di conto. Lo modificherò e lo aggiusterò. – Linuxios

+0

puoi usare 'unless' invece di' if! ' – AJcodez

Problemi correlati