Wut ‽‽‽
Mais par quelle magie ? 🤔

C’est bien la première fois que je ne comprend pas le comportement de Ruby là… On dirait du JS… 🤔

Ah mais la vache !!! Ça a modifié la valeur par défaut en fait !!!!

[30] pry(main)> f = Hash.new []
=> {}
[31] pry(main)> f[:foo] << :bar
=> [:bar]
[32] pry(main)> f[:bar]
=> [:bar]

@aeris oui, c'est le même tableau qui est utilisé partout

```
[1] pry(main)> plop = []
=> []
[2] pry(main)> f = Hash.new plop
=> {}
[3] pry(main)> f[:foo] << :bar
=> [:bar]
[4] pry(main)> plop
=> [:bar]
```

Si tu en veux un nouveau pour chaque valeur par défaut, il faut utiliser un bloc :

```
[1] pry(main)> f = Hash.new { [] }
=> {}
[2] pry(main)> f[:foo] << :baz
=> [:baz]
[3] pry(main)> f[:baz]
=> []
```

aeris ☣ 🇫🇷 @aeris

@bmichel En fait c’est surtout le .keys vides qui a aussi donné des migraines sur sur freenode 😂

@bmichel Et en vrai le { [] } pose aussi souci sur le .keys, qui reste vide et divers effets de bord à la con…

[1] pry(main)> f = Hash.new { [] }
=> {}
[2] pry(main)> f[:foo] << :baz
=> [:baz]
[3] pry(main)> f
=> {} 🤔
[4] pry(main)> f.keys
=> [] 🤔
[5] pry(main)> f[:foo]
=> [] 🤔
[6] pry(main)> f[:bar]
=> []

@bmichel La solution indiquée sur IRC est d’utiliser <<= en plus de { [] }

[8] pry(main)> f = Hash.new { [] }
=> {}
[9] pry(main)> f[:foo] <<= :baz
=> [:baz]
[10] pry(main)> f
=> {:foo=>[:baz]}
[11] pry(main)> f.keys
=> [:foo]
[12] pry(main)> f[:foo]
=> [:baz]
[13] pry(main)> f[:bar]
=> []

@bmichel Tout est justifiable proprement, mais ça doit quand même être la source incompréhensible de quelques bugs 😂

@aeris oui, je n'ai jamais trop compris pourquoi la valeur par défaut était renvoyée avec un getter, mais l'élément n'est pas ajouté au hash

@bmichel En fait c’est finalement assez logique
« f[:foo] << bar » est finalement du sucre pour foo = f[:foo]; foo << bar », qui effectivement ne réaffecte jamais foo à la fin à « f[:foo] ». Et laisse donc le hash vide !