Se todas as chaves forem cadeias de caracteres e todas elas tiverem o prefixo de sublinhado, você poderá corrigir o hash no lugar com isso:
h.keys.each { |k| h[k[1, k.length - 1]] = h[k]; h.delete(k) }
O k[1, k.length - 1]
bit agarra todos, k
exceto o primeiro caractere. Se você deseja uma cópia, então:
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 }
Você também pode usar sub
se não gostar da k[]
notação para extrair uma substring:
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 }
E, se apenas algumas das chaves tiverem o prefixo de sublinhado:
h.keys.each do |k|
if(k[0,1] == '_')
h[k[1, k.length - 1]] = h[k]
h.delete(k)
end
end
Modificações semelhantes podem ser feitas em todas as outras variantes acima, mas estas duas:
Hash[h.map { |k, v| [k.sub(/\A_/, ''), v] }]
h.inject({ }) { |x, (k,v)| x[k.sub(/\A_/, '')] = v; x }
deve estar bem com chaves que não tenham prefixos de sublinhado sem modificações extras.