Ok, questo è il mio secondo tentativo di eseguire il debug dei problemi di memoria con la mia app Sinatra. Credo di averlo inchiodato in codice di esempio semplice questa volta.Ruby Symbol # to_proc perde riferimenti in 1.9.2-p180?
Sembra che quando si filtra un array attraverso .map(&:some_method)
, gli elementi di quell'array non vengano recuperati. Eseguire l'equivalente .map{|x| x.some_method}
è assolutamente soddisfacente.
Dimostrazione: Dato un semplice classe di esempio:
class C
def foo
"foo"
end
end
Se eseguo quanto segue in IRB, questo venga rilevato normalmente:
ruby-1.9.2-p180 :001 > a = 10.times.map{C.new}
=> [...]
ruby-1.9.2-p180 :002 > b = a.map{|x| x.foo}
=> ["foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo"]
ruby-1.9.2-p180 :003 > ObjectSpace.each_object(C){}
=> 10
ruby-1.9.2-p180 :004 > a = nil
=> nil
ruby-1.9.2-p180 :005 > b = nil
=> nil
ruby-1.9.2-p180 :006 > GC.start
=> nil
ruby-1.9.2-p180 :007 > ObjectSpace.each_object(C){}
=> 0
Quindi esistono più riferimenti a C. Buona. Ma sostituendo map{|x| x.foo} with map(&:foo)
(che viene pubblicizzato come equivalente), non ottiene raccolte:
ruby-1.9.2-p180 :001 > a = 10.times.map{C.new}
=> [...]
ruby-1.9.2-p180 :002 > b = a.map(&:foo)
=> ["foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo"]
ruby-1.9.2-p180 :003 > ObjectSpace.each_object(C){}
=> 10
ruby-1.9.2-p180 :004 > a = nil
=> nil
ruby-1.9.2-p180 :005 > b = nil
=> nil
ruby-1.9.2-p180 :006 > GC.start
=> nil
ruby-1.9.2-p180 :007 > ObjectSpace.each_object(C){}
=> 10
ruby-1.9.2-p180 :008 >
Si tratta di un bug rubino? Cercherò in più versioni di ruby per essere sicuro, ma questo sembra un problema ovvio. Qualcuno sa cosa sto sbagliando?
Edit:
ho provato questo in 1.8.7-P352 e non ha il problema. 1.9.3-preview1 fa tuttavia ha ancora il problema. Un bug report è in ordine o sto facendo qualcosa di sbagliato?
Edit2: formattazione (? Perché mettere quattro spazi prima di ogni sintassi di prodotti linea di evidenziazione mentre <pre>
tag non lo fanno)
Proverò a inviare una segnalazione di errore ma sto riscontrando problemi nella configurazione di un account sulla Ruby Redmine. Aspetterò fino a tardi nel caso in cui abbiano problemi con il loro sistema di accesso. –
Sto utilizzando Google Mail e ha contrassegnato la loro e-mail di conferma come spam. Forse dovresti controllare la tua cartella spam: D –
Buona chiamata! Non avevo idea di aver nemmeno inviato una mail di conferma. Comunque, Bug # 5261: http://redmine.ruby-lang.org/issues/5261 –