Jika semua kunci adalah string dan semuanya memiliki awalan garis bawah, maka Anda dapat menambal hash di tempat dengan ini:
h.keys.each { |k| h[k[1, k.length - 1]] = h[k]; h.delete(k) }
The k[1, k.length - 1]
bit meraih semua k
kecuali karakter pertama. Jika Anda ingin salinan, maka:
new_h = Hash[h.map { |k, v| [k[1, k.length - 1], v] }]
Atau
new_h = h.inject({ }) { |x, (k,v)| x[k[1, k.length - 1]] = v; x }
Anda juga dapat menggunakan sub
jika Anda tidak menyukai k[]
notasi untuk mengekstraksi 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 }
Dan, jika hanya beberapa tombol memiliki awalan garis bawah:
h.keys.each do |k|
if(k[0,1] == '_')
h[k[1, k.length - 1]] = h[k]
h.delete(k)
end
end
Modifikasi serupa dapat dilakukan untuk semua varian lain di atas tetapi dua ini:
Hash[h.map { |k, v| [k.sub(/\A_/, ''), v] }]
h.inject({ }) { |x, (k,v)| x[k.sub(/\A_/, '')] = v; x }
harus baik-baik saja dengan kunci yang tidak memiliki awalan garis bawah tanpa modifikasi tambahan.