Ruby Hash populated from Array.product yields unexpected behavior









up vote
0
down vote

favorite












I wanted to pre-populate a Hash, given an array of keys and a default value (an empty array). I attempted to do this using the #product method of Array.



> hash = Hash[[:foo, :bar].product([])] # => :foo=>, :bar=>
> hash[:foo].push(:baz) # => :foo=>[:baz], :bar=>[:baz]


I don't understand why the value is being applied to all keys in the hash. If instead, I use the returned value of product and populate the hash directly from that, I get expected behavior.



> [:foo, :bar].product([]) # => [[:foo, ], [:bar, ]]
> hash = Hash[[[:foo, ], [:bar, ]]] # => :foo=>, :bar=>
> hash[:foo].push(:baz) # => :foo=>[:baz], :bar=>


I am using ruby 2.3.6










share|improve this question

























    up vote
    0
    down vote

    favorite












    I wanted to pre-populate a Hash, given an array of keys and a default value (an empty array). I attempted to do this using the #product method of Array.



    > hash = Hash[[:foo, :bar].product([])] # => :foo=>, :bar=>
    > hash[:foo].push(:baz) # => :foo=>[:baz], :bar=>[:baz]


    I don't understand why the value is being applied to all keys in the hash. If instead, I use the returned value of product and populate the hash directly from that, I get expected behavior.



    > [:foo, :bar].product([]) # => [[:foo, ], [:bar, ]]
    > hash = Hash[[[:foo, ], [:bar, ]]] # => :foo=>, :bar=>
    > hash[:foo].push(:baz) # => :foo=>[:baz], :bar=>


    I am using ruby 2.3.6










    share|improve this question























      up vote
      0
      down vote

      favorite









      up vote
      0
      down vote

      favorite











      I wanted to pre-populate a Hash, given an array of keys and a default value (an empty array). I attempted to do this using the #product method of Array.



      > hash = Hash[[:foo, :bar].product([])] # => :foo=>, :bar=>
      > hash[:foo].push(:baz) # => :foo=>[:baz], :bar=>[:baz]


      I don't understand why the value is being applied to all keys in the hash. If instead, I use the returned value of product and populate the hash directly from that, I get expected behavior.



      > [:foo, :bar].product([]) # => [[:foo, ], [:bar, ]]
      > hash = Hash[[[:foo, ], [:bar, ]]] # => :foo=>, :bar=>
      > hash[:foo].push(:baz) # => :foo=>[:baz], :bar=>


      I am using ruby 2.3.6










      share|improve this question













      I wanted to pre-populate a Hash, given an array of keys and a default value (an empty array). I attempted to do this using the #product method of Array.



      > hash = Hash[[:foo, :bar].product([])] # => :foo=>, :bar=>
      > hash[:foo].push(:baz) # => :foo=>[:baz], :bar=>[:baz]


      I don't understand why the value is being applied to all keys in the hash. If instead, I use the returned value of product and populate the hash directly from that, I get expected behavior.



      > [:foo, :bar].product([]) # => [[:foo, ], [:bar, ]]
      > hash = Hash[[[:foo, ], [:bar, ]]] # => :foo=>, :bar=>
      > hash[:foo].push(:baz) # => :foo=>[:baz], :bar=>


      I am using ruby 2.3.6







      ruby hash






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 8 at 17:21









      myles

      186




      186






















          1 Answer
          1






          active

          oldest

          votes

















          up vote
          1
          down vote



          accepted










          It's because the arrays that you pass to your hash initializer are the same object, so if you modify said object, the changes will be present everywhere it is used:



          > hash = Hash[[:foo, :bar].product([])]
          # => :foo=>, :bar=>
          > hash[:foo].object_id
          # => 47106586247680
          > hash[:bar].object_id
          # => 47106586247680


          If you copy-paste the output of your product, you're using 2 different arrays as they get instantiated separately.






          share|improve this answer




















            Your Answer






            StackExchange.ifUsing("editor", function ()
            StackExchange.using("externalEditor", function ()
            StackExchange.using("snippets", function ()
            StackExchange.snippets.init();
            );
            );
            , "code-snippets");

            StackExchange.ready(function()
            var channelOptions =
            tags: "".split(" "),
            id: "1"
            ;
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function()
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled)
            StackExchange.using("snippets", function()
            createEditor();
            );

            else
            createEditor();

            );

            function createEditor()
            StackExchange.prepareEditor(
            heartbeatType: 'answer',
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader:
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            ,
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            );



            );













             

            draft saved


            draft discarded


















            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53213044%2fruby-hash-populated-from-array-product-yields-unexpected-behavior%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            1
            down vote



            accepted










            It's because the arrays that you pass to your hash initializer are the same object, so if you modify said object, the changes will be present everywhere it is used:



            > hash = Hash[[:foo, :bar].product([])]
            # => :foo=>, :bar=>
            > hash[:foo].object_id
            # => 47106586247680
            > hash[:bar].object_id
            # => 47106586247680


            If you copy-paste the output of your product, you're using 2 different arrays as they get instantiated separately.






            share|improve this answer
























              up vote
              1
              down vote



              accepted










              It's because the arrays that you pass to your hash initializer are the same object, so if you modify said object, the changes will be present everywhere it is used:



              > hash = Hash[[:foo, :bar].product([])]
              # => :foo=>, :bar=>
              > hash[:foo].object_id
              # => 47106586247680
              > hash[:bar].object_id
              # => 47106586247680


              If you copy-paste the output of your product, you're using 2 different arrays as they get instantiated separately.






              share|improve this answer






















                up vote
                1
                down vote



                accepted







                up vote
                1
                down vote



                accepted






                It's because the arrays that you pass to your hash initializer are the same object, so if you modify said object, the changes will be present everywhere it is used:



                > hash = Hash[[:foo, :bar].product([])]
                # => :foo=>, :bar=>
                > hash[:foo].object_id
                # => 47106586247680
                > hash[:bar].object_id
                # => 47106586247680


                If you copy-paste the output of your product, you're using 2 different arrays as they get instantiated separately.






                share|improve this answer












                It's because the arrays that you pass to your hash initializer are the same object, so if you modify said object, the changes will be present everywhere it is used:



                > hash = Hash[[:foo, :bar].product([])]
                # => :foo=>, :bar=>
                > hash[:foo].object_id
                # => 47106586247680
                > hash[:bar].object_id
                # => 47106586247680


                If you copy-paste the output of your product, you're using 2 different arrays as they get instantiated separately.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 8 at 17:25









                Marcin Kołodziej

                3,113313




                3,113313



























                     

                    draft saved


                    draft discarded















































                     


                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53213044%2fruby-hash-populated-from-array-product-yields-unexpected-behavior%23new-answer', 'question_page');

                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

                    How do I collapse sections of code in Visual Studio Code for Windows?

                    ャフサォクコ ケウ,コ,ワ メ,ロスョノ゙,クネ,フムカヤヲニ,エコ゚ツ ウイオン゙ケワサネォキモュキォウイノンコチ゚メヌナイゥフュ,カヒウネェ ネ,ホノケ,ムュキ ッボーミュハ,チ ツス ィ メウイマヤ,゙ウチ ヅ ロ,ォジヌェ ャヌット ェ,マャ,チナエヒネソキツテ トホヲヲミーァ