Skip to content

Commit e3cf05e

Browse files
author
ci-build
committed
[skip ci] Update site
1 parent 3868ba5 commit e3cf05e

File tree

1 file changed

+45
-1
lines changed

1 file changed

+45
-1
lines changed

index.html

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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] &lt;&lt; '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">-&gt;</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">-&gt;</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

Comments
 (0)