Nếu tất cả các khóa là các chuỗi và tất cả chúng đều có tiền tố gạch dưới, thì bạn có thể vá lỗi băm tại chỗ bằng cách này:
h.keys.each { |k| h[k[1, k.length - 1]] = h[k]; h.delete(k) }
Các k[1, k.length - 1]
bit lấy tất cảk
ngoại trừ ký tự đầu tiên. Nếu bạn muốn có một bản sao, thì:
new_h = Hash[h.map { |k, v| [k[1, k.length - 1], v] }]
Hoặc là
new_h = h.inject({ }) { |x, (k,v)| x[k[1, k.length - 1]] = v; x }
Bạn cũng có thể sử dụng sub
nếu bạn không thíchk[]
ký hiệu trích xuất một chuỗi con:
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 }
Và, nếu chỉ một số phím có tiền tố gạch dưới:
h.keys.each do |k|
if(k[0,1] == '_')
h[k[1, k.length - 1]] = h[k]
h.delete(k)
end
end
Sửa đổi tương tự có thể được thực hiện cho tất cả các biến thể khác ở trên nhưng hai biến thể sau:
Hash[h.map { |k, v| [k.sub(/\A_/, ''), v] }]
h.inject({ }) { |x, (k,v)| x[k.sub(/\A_/, '')] = v; x }
sẽ ổn với các khóa không có tiền tố gạch dưới mà không cần sửa đổi thêm.