How does shovel (<<) operator work in Ruby Hashes?

后端 未结 2 1344
情歌与酒
情歌与酒 2020-12-04 12:06

I was going through Ruby Koans tutorial series, when I came upon this in about_hashes.rb:

def test_default_value_is_the_same_object
  hash = Has         


        
2条回答
  •  旧时难觅i
    2020-12-04 12:45

    When you're doing hash = Hash.new([]) you are creating a Hash whose default value is the exact same Array instance for all keys. So whenever you are accessing a key that doesn't exist, you get back the very same Array.

    h = Hash.new([])
    h[:foo].object_id # => 12215540
    h[:bar].object_id # => 12215540
    

    If you want one array per key, you have to use the block syntax of Hash.new:

    h = Hash.new { |h, k| h[k] = [] }
    h[:foo].object_id # => 7791280
    h[:bar].object_id # => 7790760
    

    Edit: Also see what Gazler has to say with regard to the #<< method and on what object you are actually calling it.

提交回复
热议问题