Se tutte le chiavi sono stringhe e tutte hanno il prefisso di sottolineatura, allora puoi correggere l'hash in atto con questo:
h.keys.each { |k| h[k[1, k.length - 1]] = h[k]; h.delete(k) }
Il k[1, k.length - 1]
bit prende tutto k
tranne il primo personaggio. Se vuoi una copia, allora:
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 }
Puoi anche usarlo sub
se non ti piace la k[]
notazione per l'estrazione di una sottostringa:
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 solo alcune delle chiavi hanno il prefisso di sottolineatura:
h.keys.each do |k|
if(k[0,1] == '_')
h[k[1, k.length - 1]] = h[k]
h.delete(k)
end
end
Modifiche simili possono essere apportate a tutte le altre varianti sopra, ma queste due:
Hash[h.map { |k, v| [k.sub(/\A_/, ''), v] }]
h.inject({ }) { |x, (k,v)| x[k.sub(/\A_/, '')] = v; x }
dovrebbe andare bene con i tasti che non hanno prefissi di sottolineatura senza ulteriori modifiche.