# PerchÃ© Hash#partition non restituisce due Hash?

**URL:** <https://www.ruby-forum.com/t/percha-hash-partition-non-restituisce-due-hash/179766>\
**Category:** IT\
**Created:** [December 3, 2009, 12:56pm UTC](https://www.ruby-forum.com/t/percha-hash-partition-non-restituisce-due-hash/179766 "2009-12-03T12:56:39Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![gderosa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/4da419/32.png) [@gderosa](https://www.ruby-forum.com/u/gderosa)\
**Post date:** [December 3, 2009, 12:56pm UTC](https://www.ruby-forum.com/t/percha-hash-partition-non-restituisce-due-hash/179766/1 "2009-12-03T12:56:39Z")

</div>

Ciao:

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

```

e giustamente:

```
selected #=> {"a"=>1, "c"=>3}

```

Ora, sempre nella classe Hash, il metodo partition _dovrebbe_ avere un  
comportamento simile, e restituire due Hash:

```
selected, discarded = h.partition {|key, val| key < 'b' or val > 2}

```

invece:

```
selected #=> [["a", 1], ["c", 3]]
discarded #=> [["b", 2]]

```

quando mi sembrerebbe piÃ¹ pulito e coerente ottenere:

```
selected #=> {"a" => 1, "c" => 3}
discarded #=> {"b" => 2}

```

So che Ã¨ facilissimo convertire gli Array di sopra negli Hash di sotto,  
ma mi chiedo il motivo di tale inconsistenza in core ruby. Cosa mi  
sfugge?

Grazie,  
Guido

P.S. faccio riferimento a ruby1.9, non so come si comporta 1.8.

---

<div class="post-metadata">

**Author:** ![gderosa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/4da419/32.png) [@gderosa](https://www.ruby-forum.com/u/gderosa)\
**Post date:** [December 3, 2009, 1:29pm UTC](https://www.ruby-forum.com/t/percha-hash-partition-non-restituisce-due-hash/179766/2 "2009-12-03T13:29:29Z")

</div>

Guido De Rosa wrote:

> So che Ã¨ facilissimo convertire gli Array di sopra negli Hash di sotto,  
> ma mi chiedo il motivo di tale inconsistenza in core ruby. Cosa mi  
> sfugge?

Non Ã¨ un inconsistenza, Ã¨ voluto:  
dalle api:

enum.partition {| obj | block } =\> [true\_array, false\_array]

Returns two arrays, the first containing the elements of enum for which  
the block evaluates to true, the second containing the rest.

(1..6).partition {|i| (i&1).zero?} #=\> [[2, 4, 6], [1, 3, 5]]

---

<div class="post-metadata">

**Author:** ![gderosa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/4da419/32.png) [@gderosa](https://www.ruby-forum.com/u/gderosa)\
**Post date:** [December 3, 2009, 1:33pm UTC](https://www.ruby-forum.com/t/percha-hash-partition-non-restituisce-due-hash/179766/3 "2009-12-03T13:33:48Z")

</div>

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 🙂 ).

---

<div class="post-metadata">

**Author:** ![gderosa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/4da419/32.png) [@gderosa](https://www.ruby-forum.com/u/gderosa)\
**Post date:** [December 3, 2009, 4:50pm UTC](https://www.ruby-forum.com/t/percha-hash-partition-non-restituisce-due-hash/179766/4 "2009-12-03T16:50:40Z")

</div>

Alessandro S. 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/core-1.8.7/classes/Hash.html#M000183)  
[http://ruby-doc.org/ruby-1.9/classes/Hash.html#M000401](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.
