Si todas las teclas son cadenas y todas tienen el prefijo de subrayado, entonces puede parchear el hash en su lugar con esto:
h.keys.each { |k| h[k[1, k.length - 1]] = h[k]; h.delete(k) }
El k[1, k.length - 1]
bit agarra todo k
excepto el primer personaje. Si quieres una copia, entonces:
new_h = Hash[h.map { |k, v| [k[1, k.length - 1], v] }]
O
new_h = h.inject({ }) { |x, (k,v)| x[k[1, k.length - 1]] = v; x }
También puede usar sub
si no le gusta la k[]
notación para extraer una subcadena:
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 }
Y, si solo algunas de las teclas tienen el prefijo de subrayado:
h.keys.each do |k|
if(k[0,1] == '_')
h[k[1, k.length - 1]] = h[k]
h.delete(k)
end
end
Se pueden hacer modificaciones similares a todas las otras variantes anteriores, pero estas dos:
Hash[h.map { |k, v| [k.sub(/\A_/, ''), v] }]
h.inject({ }) { |x, (k,v)| x[k.sub(/\A_/, '')] = v; x }
debería estar bien con las teclas que no tienen prefijos de subrayado sin modificaciones adicionales.