Hashのkeyをシンボルから文字列へ変更する
Hashをeachで回している時に、レシーバであるハッシュに新しいkeyを追加することはできません。RuntimeErrorが発生し、can't add a new key into hash during iterationと表示されます。
そこで先に文字列に変換したkeyの配列を作ります。このkeyの配列をeachで回して、そのループの中でHashに新しいkeyを追加します。eachのレシーバはHashではなく、keyの配列なのでエラーは起きません。ただ、要素数が2倍になるので古いシンボルのペアは削除します。
hash = {id: 1, name: "Mike"}
keys = hash.keys.map {|v| v.to_s}
assert_equal keys, ["id", "name"]
keys.each do |key|
hash[key] = hash[key.to_sym]
hash.delete(key.to_sym)
end
Arrayの場合は、レシーバから値を取り出すことはありますが、レシーバに値を追加することはあまりないと思うので気にする必要はないかもしれません。
array1 = [1, 2]
array2 = [3, 4]
array2.each do |val|
array1.push(val)
end
assert_equal array1, [1, 2, 3, 4]
assert_equal array2, [3, 4]