Hash.new()
Hash.new()で作成されたハッシュは、存在しないキーが指定されるとnilが返されます。
hash1 = Hash.new()
hash1["apple"] = 3
hash1["banana"] = 2
puts hash1["apple"] # 3が出力されます
puts hash1["banana"] # 2が出力されます
puts hash1["orange"] # nilが出力されます
Hash.new(0)
Hash.new(0)で作成されたハッシュは、存在しないキーが指定されるとデフォルト値である0が返されます。
hash2 = Hash.new(0)
hash2["apple"] = 3
hash2["banana"] = 2
puts hash2["apple"] # 3が出力されます
puts hash2["banana"] # 2が出力されます
puts hash2["orange"] # 0が出力されます
Hash.new()
とHash.new(0)
の違い
存在しないキーにアクセスしたときに返される値(デフォルト値)が異なります。Hash.new()の場合、デフォルト値はnilですが、Hash.new(0)の場合、デフォルト値は0です。
Hash.new(0)
を利用するメリット
このコードでは、ハッシュの値をカウントしています。Hash.new(0)
を利用することで、存在しないキーにアクセスしたときに返される値が0になるため、ハッシュの値をカウントするような場合に便利です。Hash.new()
を利用することで、"apple","banana"キーが存在しないため、undefined method `+' for nil:NilClass (NoMethodError)
のエラーになります。
# Hash.new(0)を利用するメリット
hash = Hash.new(0)
hash["apple"] += 1
hash["banana"] += 1
hash["apple"] += 1
puts hash["apple"] # 2が出力されます
puts hash["banana"] # 1が出力されます
puts hash["orange"] # 0が出力されます
# Hash.new()の場合
hash = Hash.new()
hash["apple"] += 1 # undefined method `+' for nil:NilClass (NoMethodError)
hash["banana"] += 1 # undefined method `+' for nil:NilClass (NoMethodError)