Si toutes les clés sont des chaînes et qu'elles ont toutes le préfixe de soulignement, vous pouvez corriger le hachage en place avec ceci:
h.keys.each { |k| h[k[1, k.length - 1]] = h[k]; h.delete(k) }
Le k[1, k.length - 1]
bit saisit tout k
sauf le premier caractère. Si vous voulez une copie, alors:
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 la k[]
notation pour extraire 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 certaines des touches ont le préfixe de soulignement:
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 peuvent être apportées à 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 convenir aux clés qui n'ont pas de préfixes de soulignement sans modifications supplémentaires.