Si toutes les clés sont des chaînes de caractères et tous ont le trait de soulignement préfixe, alors vous pouvez patcher le hachage en place avec ceci:
h.keys.each { |k| h[k[1, k.length - 1]] = h[k]; h.delete(k) }
L' k[1, k.length - 1]
peu de s'approprier la totalité des k
à l'exception du premier caractère. Si vous voulez une copie, puis:
new_h = Hash[h.map { |k, v| [k[1, k.length - 1], v] }]
Ou
new_h = h.inject({ }) { |x, (k,v)| x[k[1, k.length - 1]] = v; x }
Vous pouvez également utiliser sub
si vous n'aimez pas l' k[]
notation pour l'extraction d'une sous-chaîne:
h.keys.each { |k| h[k.sub(/\A_/, '')] = h[k]; h.delete(k) }
Hash[h.map { |k, v| [k.sub(/\A_/, ''), v] }]
h.inject({ }) { |x, (k,v)| x[k.sub(/\A_/, '')] = v; x }
Et, si seulement quelques-unes des clés ont le trait de soulignement préfixe:
h.keys.each do |k|
if(k[0,1] == '_')
h[k[1, k.length - 1]] = h[k]
h.delete(k)
end
end
Des modifications similaires qui peut être fait pour toutes les autres variantes ci-dessus, mais ces deux:
Hash[h.map { |k, v| [k.sub(/\A_/, ''), v] }]
h.inject({ }) { |x, (k,v)| x[k.sub(/\A_/, '')] = v; x }
devrait être d'accord avec les touches qui n'ont pas de souligner les préfixes sans des modifications supplémentaires.