@@ -904,6 +904,7 @@ <h1>Ruby Style Guide</h1>
904904< li > < a href ="#set-vs-array "> Set vs Array</ a > </ li >
905905< li > < a href ="#symbols-as-keys "> Symbols as Keys</ a > </ li >
906906< li > < a href ="#no-mutable-keys "> No Mutable Keys</ a > </ li >
907+ < li > < a href ="#no-mutable-defaults "> No Mutable Defaults</ a > </ li >
907908< li > < a href ="#hash-literals "> Hash Literals</ a > </ li >
908909< li > < a href ="#hash-literal-values "> Hash Literal Values</ a > </ li >
909910< li > < a href ="#hash-literal-as-last-array-item "> Hash Literal as Last Array Item</ a > </ li >
@@ -6113,6 +6114,49 @@ <h3 id="no-mutable-keys"><a class="anchor" href="#no-mutable-keys"></a><a class=
61136114</ div >
61146115</ div >
61156116< div class ="sect2 ">
6117+ < h3 id ="no-mutable-defaults "> < a class ="anchor " href ="#no-mutable-defaults "> </ a > < a class ="link " href ="#no-mutable-defaults "> No Mutable Defaults</ a > </ h3 >
6118+ < div class ="paragraph ">
6119+ < p > Avoid the use of shared mutable objects as hash default values.</ p >
6120+ </ div >
6121+ < div class ="paragraph ">
6122+ < p > Creating a Hash in such a way will share the default value
6123+ across all keys, causing unexpected behavior when modifying it.</ p >
6124+ </ div >
6125+ < div class ="paragraph ">
6126+ < p > For example, when the Hash was created with an Array as the argument,
6127+ calling < code > hash[:foo] << 'bar'</ code > will also change the value of all
6128+ other keys that have not been explicitly assigned to.</ p >
6129+ </ div >
6130+ < div class ="listingblock ">
6131+ < div class ="content ">
6132+ < pre class ="rouge highlight "> < code data-lang ="ruby "> < span class ="c1 "> # bad</ span >
6133+ < span class ="no "> Hash</ span > < span class ="p "> .</ span > < span class ="nf "> new</ span > < span class ="p "> ([])</ span >
6134+ < span class ="no "> Hash</ span > < span class ="p "> .</ span > < span class ="nf "> new</ span > < span class ="p "> ({})</ span >
6135+ < span class ="no "> Hash</ span > < span class ="p "> .</ span > < span class ="nf "> new</ span > < span class ="p "> (</ span > < span class ="no "> Array</ span > < span class ="p "> .</ span > < span class ="nf "> new</ span > < span class ="p "> )</ span >
6136+ < span class ="no "> Hash</ span > < span class ="p "> .</ span > < span class ="nf "> new</ span > < span class ="p "> (</ span > < span class ="no "> Hash</ span > < span class ="p "> .</ span > < span class ="nf "> new</ span > < span class ="p "> )</ span >
6137+
6138+ < span class ="c1 "> # okay -- beware this will silently discard mutations and only remember assignments</ span >
6139+ < span class ="no "> Hash</ span > < span class ="p "> .</ span > < span class ="nf "> new</ span > < span class ="p "> {</ span > < span class ="no "> Array</ span > < span class ="p "> .</ span > < span class ="nf "> new</ span > < span class ="p "> }</ span >
6140+ < span class ="no "> Hash</ span > < span class ="p "> .</ span > < span class ="nf "> new</ span > < span class ="p "> {</ span > < span class ="no "> Hash</ span > < span class ="p "> .</ span > < span class ="nf "> new</ span > < span class ="p "> }</ span >
6141+ < span class ="no "> Hash</ span > < span class ="p "> .</ span > < span class ="nf "> new</ span > < span class ="p "> {</ span > < span class ="p "> {}</ span > < span class ="p "> }</ span >
6142+ < span class ="no "> Hash</ span > < span class ="p "> .</ span > < span class ="nf "> new</ span > < span class ="p "> {</ span > < span class ="p "> []</ span > < span class ="p "> }</ span >
6143+
6144+ < span class ="c1 "> # good - frozen solution will raise an error when mutation is attempted</ span >
6145+ < span class ="no "> Hash</ span > < span class ="p "> .</ span > < span class ="nf "> new</ span > < span class ="p "> ([].</ span > < span class ="nf "> freeze</ span > < span class ="p "> )</ span >
6146+ < span class ="no "> Hash</ span > < span class ="p "> .</ span > < span class ="nf "> new</ span > < span class ="p "> ({}.</ span > < span class ="nf "> freeze</ span > < span class ="p "> )</ span >
6147+
6148+ < span class ="c1 "> # good - using a proc will create a new object for each key</ span >
6149+ < span class ="n "> h</ span > < span class ="o "> =</ span > < span class ="no "> Hash</ span > < span class ="p "> .</ span > < span class ="nf "> new</ span >
6150+ < span class ="n "> h</ span > < span class ="p "> .</ span > < span class ="nf "> default_proc</ span > < span class ="o "> =</ span > < span class ="o "> -></ span > < span class ="p "> (</ span > < span class ="n "> h</ span > < span class ="p "> ,</ span > < span class ="n "> k</ span > < span class ="p "> )</ span > < span class ="p "> {</ span > < span class ="p "> []</ span > < span class ="p "> }</ span >
6151+ < span class ="n "> h</ span > < span class ="p "> .</ span > < span class ="nf "> default_proc</ span > < span class ="o "> =</ span > < span class ="o "> -></ span > < span class ="p "> (</ span > < span class ="n "> h</ span > < span class ="p "> ,</ span > < span class ="n "> k</ span > < span class ="p "> )</ span > < span class ="p "> {</ span > < span class ="p "> {}</ span > < span class ="p "> }</ span >
6152+
6153+ < span class ="c1 "> # good - using a block will create a new object for each key</ span >
6154+ < span class ="no "> Hash</ span > < span class ="p "> .</ span > < span class ="nf "> new</ span > < span class ="p "> {</ span > < span class ="o "> |</ span > < span class ="n "> h</ span > < span class ="p "> ,</ span > < span class ="n "> k</ span > < span class ="o "> |</ span > < span class ="n "> h</ span > < span class ="p "> [</ span > < span class ="n "> k</ span > < span class ="p "> ]</ span > < span class ="o "> =</ span > < span class ="p "> []</ span > < span class ="p "> }</ span >
6155+ < span class ="no "> Hash</ span > < span class ="p "> .</ span > < span class ="nf "> new</ span > < span class ="p "> {</ span > < span class ="o "> |</ span > < span class ="n "> h</ span > < span class ="p "> ,</ span > < span class ="n "> k</ span > < span class ="o "> |</ span > < span class ="n "> h</ span > < span class ="p "> [</ span > < span class ="n "> k</ span > < span class ="p "> ]</ span > < span class ="o "> =</ span > < span class ="p "> {}</ span > < span class ="p "> }</ span > </ code > </ pre >
6156+ </ div >
6157+ </ div >
6158+ </ div >
6159+ < div class ="sect2 ">
61166160< h3 id ="hash-literals "> < a class ="anchor " href ="#hash-literals "> </ a > < a class ="link " href ="#hash-literals "> Hash Literals</ a > </ h3 >
61176161< div class ="paragraph ">
61186162< p > Use the Ruby 1.9 hash literal syntax when your hash keys are symbols.</ p >
@@ -8401,7 +8445,7 @@ <h2 id="spread-the-word"><a class="anchor" href="#spread-the-word"></a><a class=
84018445</ div >
84028446< div id ="footer ">
84038447< div id ="footer-text ">
8404- Last updated 2024-10-16 09:49:00 UTC
8448+ Last updated 2024-12-18 06:54:25 UTC
84058449</ div >
84068450</ div >
84078451</ body >
0 commit comments