Disons que j'ai un imbriquée Hash h
arbitraire profonde:Comment remplacer toutes les valeurs d'un hachage par une nouvelle valeur?
h = {
:foo => { :bar => 1 },
:baz => 10,
:quux => { :swozz => {:muux => 1000}, :grimel => 200 }
# ...
}
Et disons que j'ai une classe C
définie comme:
class C
attr_accessor :dict
end
Comment puis-je remplacer toutes les valeurs imbriquées dans h
afin qu'ils sont maintenant C
instances avec l'attribut dict
défini à cette valeur? Par exemple, dans l'exemple ci-dessus, je vous attendre à avoir quelque chose comme:
h = {
:foo => <C @dict={:bar => 1}>,
:baz => 10,
:quux => <C @dict={:swozz => <C @dict={:muux => 1000}>, :grimel => 200}>
# ...
}
où <C @dict = ...>
représente une instance C
avec @dict = ...
. (Notez que dès que vous atteignez une valeur qui est pas imbriqué, vous arrêtez l'enroulant dans C
cas.)
Vous pouvez le faire '' h.tap ... afin que vous n'avez pas à retourner h à la fin (Ruby 1.9 seulement). –
@John pour ce faire dois-je dire 'h.tap do | h | h.keys.each faire | k | ... ou peut-il être écrit plus élégamment? – mikej
C'est à peu près tout, ouais. Tap est plus utile lorsque vous l'injectez au milieu d'un flux de méthodes chaînées afin de ne pas interrompre le "flux". –