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]
@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 !
@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]
=> []