文字列リテラルはその都度オブジェクトが生成される
colors = { 'apple' => 'red', 'banana' => 'yellow' }
colors.each do |key, value|
puts value if key == 'banana'
end
=> yellow
のような処理を行いたい場合、'banana'オブジェクトが繰り返し処理が行われるたびに生成されてしまい、無駄である。
'banana'.object_id
=> 70183968739080
'banana'.object_id
=> 70183956909760
'banana'.object_id
=> 70183956844260
# 全て異なるオブジェクト
シンボルはオブジェクトがその都度生成されない。
:banana.object_id
=> 3021148
:banana.object_id
=> 3021148
:banana.object_id
=> 3021148
# 全て同じオブジェクト
そのため、ハッシュのキーをシンボルにすればオブジェクトが毎回生成されず、無駄をなくすことができる。
colors = { apple: :red, banana: :yellow }
colors.each do |key, value|
puts value if key == :banana
end
=> yellow