[ruby-it] Perché Hash#partition non restituisce due Hash?

Guido De Rosa guidoderosa a gmail.com
Gio 3 Dic 2009 16:50:40 CET


Alessandro Scolavino wrote:
> ho dimenticato un pezzo :)
> 
> è voluto in quanto partition non è un metodo di Hash ma di Enumerable, 
> quindi può applicarsi a qualsiasi collection, di conseguenza sarebbe 
> "incomprensibile" se restituisse valori differenti a seconda del tipo di 
> collection (almeno a mio parere :) ).

Sì, ma allora lo stesso discorso si dovrebbe fare per select (che pure è 
un metodo di Enumerable), e invece:

    {'a' => 1, 'b' => 2, 'c' => 3}.select {|key, val| key < b or val > 2 
}

restituisce:

    {"a"=>1, "c"=>3}

In base al ragionamento che hai appena fatto, sarebbe dovuto essere:

    [["a", 1], ["c", 3]]

In effetti, stando alla documentazione, scopro solo ora che select si 
comporta diversamente in ruby1.8 e ruby1.9 (e io uso 1.9).

http://ruby-doc.org/core-1.8.7/classes/Hash.html#M000183
http://ruby-doc.org/ruby-1.9/classes/Hash.html#M000401

Sembrerebbe che in ruby1.9 select sia stato riscritto per la classe 
Hash, mentre in 1.8 resta il risultato della mera inclusione di 
Enumerable.

Mi verrebbe da dire, a questo punto, che l'"inconsistenza" è solo di 
ruby1.9. Nel senso che i due statement:


    scelti, scartati = hash.partition {|key, val| #blocco di codice... }

e

    scelti = hash.select {|key, val| #stesso blocco di codice... }

dovrebbero ragionevolmente assegnare alla variabile "scelti" lo stesso 
valore (Hash o Array che sia).

E invece ciò è vero solo per 1.8, non per ruby 1.9 ...

G.

-- 
Posted via http://www.ruby-forum.com/.


More information about the Ml mailing list