<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Ruby on Nelson Figueroa</title><link>https://nelson.cloud/categories/ruby/</link><description>Recent content in Ruby on Nelson Figueroa</description><image><title>Nelson Figueroa</title><url>https://nelson.cloud/apple-touch-icon.png</url><link>https://nelson.cloud/categories/ruby/</link></image><language>en</language><lastBuildDate>Wed, 01 Apr 2026 22:35:32 -0700</lastBuildDate><atom:link href="https://nelson.cloud/categories/ruby/index.xml" rel="self" type="application/rss+xml"/><item><title>Preserve Child Objects When Parent Objects Are Deleted in Ruby on Rails</title><link>https://nelson.cloud/preserve-child-objects-when-parent-objects-are-deleted-in-ruby-on-rails/?ref=rss</link><pubDate>Mon, 18 Nov 2024 00:00:00 +0000</pubDate><guid>https://nelson.cloud/preserve-child-objects-when-parent-objects-are-deleted-in-ruby-on-rails/?ref=rss</guid><description>Use dependent: :nullify in Rails associations to preserve child records when parent objects are deleted.</description><content:encoded><![CDATA[<p>In most Ruby on Rails models I&rsquo;ve seen <code>dependent: :destroy</code> being used to handle child objects when a parent object is destroyed. I don&rsquo;t know why it took me this long to learn that there is also a <code>:nullify</code> option. Using <code>dependent: :nullify</code> is handy for situations where keeping associated objects after destroying the parent object is important (data retention purposes, etc).</p>
<p>For example, let&rsquo;s say we had a <code>category</code> model and a <code>transaction</code> model defined like so:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Category</span> <span class="o">&lt;</span> <span class="no">ApplicationRecord</span>
</span></span><span class="line"><span class="cl">  <span class="n">has_many</span> <span class="ss">:transactions</span><span class="p">,</span> <span class="ss">dependent</span><span class="p">:</span> <span class="ss">:nullify</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Transaction</span> <span class="o">&lt;</span> <span class="no">ApplicationRecord</span>
</span></span><span class="line"><span class="cl">  <span class="n">belongs_to</span> <span class="ss">:category</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span></span></span></code></pre></div><p>With this setup, if a category is deleted, and it has transactions associated, the <code>category_id</code> field on each transaction is set to <code>null</code>. The category is deleted but the transactions remain. A new category can then be set for each transaction, or the association can be left as <code>null</code>.</p>
<h2 id="references">References</h2>
<ul>
<li>

<a href="https://guides.rubyonrails.org/association_basics.html" target="_blank" rel="noopener">https://guides.rubyonrails.org/association_basics.html</a></li>
</ul>
]]></content:encoded></item><item><title>Ruby Arrays Cheatsheet</title><link>https://nelson.cloud/ruby-arrays-cheatsheet/?ref=rss</link><pubDate>Wed, 10 Apr 2024 00:00:00 +0000</pubDate><guid>https://nelson.cloud/ruby-arrays-cheatsheet/?ref=rss</guid><description>A Ruby arrays cheatsheet with methods and examples for coding interviews.</description><content:encoded><![CDATA[<p>This is a cheatsheet I made for myself when studying for (

<a href="https://leetcode.com/" target="_blank" rel="noopener">Leetcode</a>/

<a href="https://www.hackerrank.com/" target="_blank" rel="noopener">Hackerrank</a>)-style interviews. It&rsquo;s organized in a way that makes sense to me when I&rsquo;m trying to solve an array problem. I figured I would make it public in case it can help others :)</p>
<p>I also made a 

<a href="https://nelson.cloud/python-lists-cheatsheet/">Python Lists Cheatsheet</a> you can check out.</p>
<p>All examples were run using the 

<a href="https://www.rubyguides.com/2018/12/what-is-a-repl-in-ruby/" target="_blank" rel="noopener">Ruby v3.2.3 REPL</a>.</p>
<h2 id="initializing-an-array">Initializing an Array</h2>
<h3 id="empty-array">Empty Array</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="nb">Array</span><span class="o">.</span><span class="n">new</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; []</span></span></span></code></pre></div><p>Alternative way:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; []</span></span></span></code></pre></div><h3 id="array-with-values">Array with Values</h3>
<p>Initializing an array of integers:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [1, 2, 3, 4, 5]</span></span></span></code></pre></div><p>Initializing an array of strings:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;A&#34;, &#34;B&#34;, &#34;C&#34;]</span></span></span></code></pre></div><p>You can do the above with any type.</p>
<p>Initializing an array of symbols:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="ss">:A</span><span class="p">,</span> <span class="ss">:B</span><span class="p">,</span> <span class="ss">:C</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [:A, :B, :C]</span></span></span></code></pre></div><h4 id="shorthand-notations">Shorthand Notations</h4>
<p>With shorthand notations there is no need to add quotes for strings or colons for symbols. There&rsquo;s also no need to add commas after each element. Just separate each element with a space.</p>
<p>Initializing an array of strings using <code>%w</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="sx">%w[A B C D E]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;A&#34;, &#34;B&#34;, &#34;C&#34;, &#34;D&#34;, &#34;E&#34;]</span></span></span></code></pre></div><p>Initializing an array of symbols using <code>%i</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">%</span><span class="n">i</span><span class="o">[</span><span class="n">A</span> <span class="n">B</span> <span class="n">C</span> <span class="n">D</span> <span class="n">E</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [:A, :B, :C, :D, :E]</span></span></span></code></pre></div><h2 id="adding-elements">Adding Elements</h2>
<h3 id="at-the-beginning-of-the-array">At the Beginning of the Array</h3>
<p>Add elements to the beginning of the array with <code>unshift()</code> or <code>prepend()</code>, which is an alias for <code>unshift()</code>.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">unshift</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [0, 1, 2, 3]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [0, 1, 2, 3]</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">prepend</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [0, 1, 2, 3]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [0, 1, 2, 3]</span></span></span></code></pre></div><h3 id="at-the-end-of-the-array">At the End of the Array</h3>
<p>Add elements to the end of the array with <code>push()</code> or <code>append()</code>, which is an alias for <code>push()</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [1, 2, 3, 4]</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">a</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">a</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">a</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [1, 2, 3, 4]</span></span></span></code></pre></div><p>You can use <code>&lt;&lt;</code> as a shortcut to add elements to the end of an array:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span> <span class="c1"># [1]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">&lt;&lt;</span> <span class="mi">2</span> <span class="c1"># [1, 2]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">&lt;&lt;</span> <span class="mi">3</span> <span class="c1"># [1, 2, 3]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [1, 2, 3]</span></span></span></code></pre></div><p>If you add arrays, the arrays added to the first one will be appended in the order in which they are added:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="o">]</span> <span class="o">+</span> <span class="o">[</span><span class="mi">4</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [1, 2, 3, 4]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="o">]</span> <span class="o">+</span> <span class="o">[</span><span class="mi">7</span><span class="o">]</span> <span class="o">+</span> <span class="o">[</span><span class="mi">6</span><span class="o">]</span> <span class="o">+</span> <span class="o">[</span><span class="mi">5</span><span class="o">]</span> <span class="o">+</span> <span class="o">[</span><span class="mi">4</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [1, 2, 3, 7, 6, 5, 4]</span></span></span></code></pre></div><p>You can add arrays containing multiple elements and they will be appended:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="o">]</span> <span class="o">+</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [1, 2, 3, 1, 2, 3]</span></span></span></code></pre></div><h3 id="at-a-specific-index">At a Specific Index</h3>
<p>Use <code>insert()</code> to add an element at a specific index of an array. The <code>insert()</code> method accepts multiple parameters but the first one must be an index. This method modifies the array in-place.</p>
<p>In this example, <code>&quot;A&quot;</code> is being added at index 2:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="s2">&#34;A&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;A&#34;, &#34;B&#34;, &#34;A&#34;, &#34;C&#34;]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;A&#34;, &#34;B&#34;, &#34;A&#34;, &#34;C&#34;]</span></span></span></code></pre></div><p>Multiple elements can be added at once:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="s2">&#34;Z&#34;</span><span class="p">,</span> <span class="s2">&#34;Z&#34;</span><span class="p">,</span> <span class="s2">&#34;Z&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;A&#34;, &#34;B&#34;, &#34;Z&#34;, &#34;Z&#34;, &#34;Z&#34;, &#34;C&#34;]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;A&#34;, &#34;B&#34;, &#34;Z&#34;, &#34;Z&#34;, &#34;Z&#34;, &#34;C&#34;]</span></span></span></code></pre></div><h2 id="removing-elements">Removing Elements</h2>
<h3 id="at-the-beginning-of-the-array-1">At the Beginning of the Array</h3>
<p>Remove an element from the beginning of an array with <code>shift()</code>. This method returns the removed element and modifies the array in-place:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">shift</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; 1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [2, 3]</span></span></span></code></pre></div><h3 id="at-the-end-of-the-array-1">At the End of the Array</h3>
<p>Remove an element from the end of the array with <code>pop()</code>. This method returns the removed element and modifies the array in-place:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">pop</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; 3</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [1, 2]</span></span></span></code></pre></div><p>Delete all instances of an element by passing in that element to <code>delete()</code>. This method returns the removed element and modifies the array in-place:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; 3</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [1, 2]</span></span></span></code></pre></div><p>Attempting to delete an element that isn&rsquo;t present returns <code>nil</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; nil</span></span></span></code></pre></div><p>Note that you cannot delete multiple values in one call of <code>delete()</code>. But it is possible to do it by subtracting arrays. Keep reading after this example to see how:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># (irb):83:in `delete&#39;: wrong number of arguments (given 3, expected 1) (ArgumentError)</span></span></span></code></pre></div><p>You can subtract an array to remove all occurrences of an element and get the resulting array as a return value, but it does not modify the array in-place:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">-</span> <span class="o">[</span><span class="mi">3</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [1, 2]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [1, 2, 3, 3, 3]</span></span></span></code></pre></div><p>Subtracted arrays can have multiple elements:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">7</span><span class="o">]</span> <span class="o">-</span> <span class="o">[</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [1, 2, 3, 7, 7]</span></span></span></code></pre></div><p>Subtracting arrays with elements that aren&rsquo;t present in the first array does nothing:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="o">]</span> <span class="o">-</span> <span class="o">[</span><span class="mi">4</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [1, 2, 3]</span></span></span></code></pre></div><h3 id="at-a-specific-index-1">At a Specific Index</h3>
<p>We can delete an element at a specific index using <code>delete_at(index)</code>. The <code>delete_at()</code> method returns the element that is removed. Passing in an index that is out of bounds returns <code>nil</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">delete_at</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; &#34;B&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;A&#34;, &#34;C&#34;]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">delete_at</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; nil</span></span></span></code></pre></div><h2 id="retrieving-elements">Retrieving Elements</h2>
<h3 id="element-at-a-specific-index">Element at a Specific Index</h3>
<p>Like in most programming languages, an element can be retrieved using <code>my_array[index]</code> where <code>index</code> is an integer.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; &#34;B&#34;</span></span></span></code></pre></div><p>We can also use <code>at()</code> to get the element at a certain index. It works the same way as the previous example:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">at</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; &#34;B&#34;</span></span></span></code></pre></div><p>Negative indexes start at the end of the array.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">[-</span><span class="mi">1</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; &#34;C&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">[-</span><span class="mi">2</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; &#34;B&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">[-</span><span class="mi">3</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; &#34;A&#34;</span></span></span></code></pre></div><p>Out of bounds indexes return <code>nil</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">[</span><span class="mi">5</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; nil</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">[-</span><span class="mi">4</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; nil</span></span></span></code></pre></div><h3 id="the-first-element">The First Element</h3>
<p>There is a handy <code>first()</code> method to retrieve the first element of an array:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">first</span> <span class="c1"># equivalent to arr[0]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; &#34;A&#34;</span></span></span></code></pre></div><h3 id="the-last-element">The Last Element</h3>
<p>There&rsquo;s also a <code>last()</code> method to retrieve the last element of an array:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">last</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; &#34;C&#34;</span></span></span></code></pre></div><h3 id="range-of-elements">Range of Elements</h3>
<p>We can use a <code>..</code> or <code>...</code> to specify a range of indices within an array. These are useful for 

<a href="https://www.geeksforgeeks.org/dsa/window-sliding-technique/" target="_blank" rel="noopener">sliding window problems</a>:</p>
<p>Using <code>..</code> results in an inclusive range:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">a</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">a</span><span class="o">[</span><span class="mi">1</span><span class="o">..</span><span class="mi">4</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [2, 3, 4, 5]</span></span></span></code></pre></div><p>Using <code>...</code> results in an exclusive range:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">a</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">a</span><span class="o">[</span><span class="mi">1</span><span class="o">...</span><span class="mi">4</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [2, 3, 4]</span></span></span></code></pre></div><h3 id="maximum-element">Maximum Element</h3>
<p>We can use <code>max()</code> to retrieve the biggest number in an array:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">4</span><span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">max</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; 8</span></span></span></code></pre></div><p>If <code>max()</code> is used on an array of strings it returns the last string after sorting alphabetically:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;D&#34;</span><span class="p">,</span> <span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">max</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; &#34;D&#34;</span></span></span></code></pre></div><p>It works the same way for an array of Symbols:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="ss">:A</span><span class="p">,</span> <span class="ss">:C</span><span class="p">,</span> <span class="ss">:D</span><span class="p">,</span> <span class="ss">:B</span><span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">max</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; :D</span></span></span></code></pre></div><p><code>max()</code> will not work on an array containing elements of different types:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="s2">&#34;A&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">max</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; (irb):14:in `max&#39;: comparison of Integer with String failed (ArgumentError)</span></span></span></code></pre></div><h3 id="minimum-element">Minimum Element</h3>
<p>Works the same way as <code>max()</code> but with the smallest value instead.</p>
<p>Retrieving the smallest number in an array:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="mi">9</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">8</span><span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">min</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; 1</span></span></span></code></pre></div><p>If <code>min()</code> is used on an array of strings it returns the first string after sorting alphabetically:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;D&#34;</span><span class="p">,</span> <span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">min</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; &#34;A&#34;</span></span></span></code></pre></div><p>It works the same way for an array of Symbols:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="ss">:A</span><span class="p">,</span> <span class="ss">:C</span><span class="p">,</span> <span class="ss">:D</span><span class="p">,</span> <span class="ss">:B</span><span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">min</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; :A</span></span></span></code></pre></div><p>And once again, <code>min()</code> will not work on an array containing elements of different types:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="s2">&#34;A&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">min</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; (irb):27:in `min&#39;: comparison of Integer with String failed (ArgumentError)</span></span></span></code></pre></div><h2 id="sorting-arrays">Sorting Arrays</h2>
<p>The <code>sort()</code> method returns a sorted version of the array it is used on. This does not modify the original array:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;E&#34;</span><span class="p">,</span> <span class="s2">&#34;D&#34;</span><span class="p">,</span> <span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">sort</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;A&#34;, &#34;B&#34;, &#34;C&#34;, &#34;D&#34;, &#34;E&#34;]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;E&#34;, &#34;D&#34;, &#34;A&#34;, &#34;C&#34;, &#34;B&#34;]</span></span></span></code></pre></div><p>Use <code>sort!()</code> to modify the array in-place:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;E&#34;</span><span class="p">,</span> <span class="s2">&#34;D&#34;</span><span class="p">,</span> <span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">sort!</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;A&#34;, &#34;B&#34;, &#34;C&#34;, &#34;D&#34;, &#34;E&#34;]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;A&#34;, &#34;B&#34;, &#34;C&#34;, &#34;D&#34;, &#34;E&#34;]</span></span></span></code></pre></div><p>Sorting works with other types of elements as well.</p>
<p>Sorting integers:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="mi">5</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [5, 9, 0, 3, 4]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">sort</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [0, 3, 4, 5, 9]</span></span></span></code></pre></div><p>Sorting symbols:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="ss">:red</span><span class="p">,</span> <span class="ss">:blue</span><span class="p">,</span> <span class="ss">:green</span><span class="p">,</span> <span class="ss">:cyan</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [:red, :blue, :green, :cyan]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">sort</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [:blue, :cyan, :green, :red]</span></span></span></code></pre></div><p>Sorting multi-character strings:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;someone&#34;</span><span class="p">,</span> <span class="s2">&#34;hire&#34;</span><span class="p">,</span> <span class="s2">&#34;me&#34;</span><span class="p">,</span> <span class="s2">&#34;please&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;someone&#34;, &#34;hire&#34;, &#34;me&#34;, &#34;please&#34;]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">sort</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;hire&#34;, &#34;me&#34;, &#34;please&#34;, &#34;someone&#34;]</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;aaaa&#34;</span><span class="p">,</span> <span class="s2">&#34;aa&#34;</span><span class="p">,</span> <span class="s2">&#34;aaa&#34;</span><span class="p">,</span> <span class="s2">&#34;a&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;aaaa&#34;, &#34;aa&#34;, &#34;aaa&#34;, &#34;a&#34;]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">sort</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;a&#34;, &#34;aa&#34;, &#34;aaa&#34;, &#34;aaaa&#34;]</span></span></span></code></pre></div><blockquote><p><strong>Note:</strong></p>There&rsquo;s also a <code>sort_by()</code> method but I am too dumb to come up with good examples. You should read about it in this article instead: 

<a href="https://www.rubyguides.com/2017/07/ruby-sort/" target="_blank" rel="noopener">How to Sort Arrays &amp; Hashes in Ruby</a>.</blockquote>

<h2 id="looping-through-arrays">Looping Through Arrays</h2>
<h3 id="each-element">Each Element</h3>
<p>Use <code>each()</code> to iterate through each element in an array:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="p">,</span> <span class="s2">&#34;D&#34;</span><span class="p">,</span> <span class="s2">&#34;E&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">i</span><span class="o">|</span>
</span></span><span class="line"><span class="cl">  <span class="nb">puts</span> <span class="n">i</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># output:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># A</span>
</span></span><span class="line"><span class="cl"><span class="c1"># B</span>
</span></span><span class="line"><span class="cl"><span class="c1"># C</span>
</span></span><span class="line"><span class="cl"><span class="c1"># D</span>
</span></span><span class="line"><span class="cl"><span class="c1"># E</span></span></span></code></pre></div><h3 id="each-index">Each Index</h3>
<p>Use <code>each_index()</code> to iterate through each index in an array beginning at 0:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="p">,</span> <span class="s2">&#34;D&#34;</span><span class="p">,</span> <span class="s2">&#34;E&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">each_index</span> <span class="k">do</span> <span class="o">|</span><span class="n">i</span><span class="o">|</span>
</span></span><span class="line"><span class="cl">  <span class="nb">puts</span> <span class="n">i</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># output:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 0</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 1</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 2</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 3</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 4</span></span></span></code></pre></div><h3 id="element-and-index">Element and Index</h3>
<p>Use <code>each_with_index()</code> to iterate through both elements and indexes at the same time. The first variable in the <code>| |</code> is the element, the second one is the index.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="p">,</span> <span class="s2">&#34;D&#34;</span><span class="p">,</span> <span class="s2">&#34;E&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">each_with_index</span> <span class="k">do</span> <span class="o">|</span><span class="n">element</span><span class="p">,</span> <span class="n">index</span><span class="o">|</span>
</span></span><span class="line"><span class="cl">  <span class="nb">puts</span> <span class="s2">&#34;</span><span class="si">#{</span><span class="n">index</span><span class="si">}</span><span class="s2">: </span><span class="si">#{</span><span class="n">element</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># output:</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 0: A</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 1: B</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 2: C</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 3: D</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 4: E</span></span></span></code></pre></div><h2 id="modifying-all-elements-in-an-array">Modifying All Elements in an Array</h2>
<p>We can use <code>map()</code> to modify all elements in an array.</p>
<p>For example, to increment all integers in an array we can do the following:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span> <span class="o">|</span><span class="n">i</span><span class="o">|</span> <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="c1">#  =&gt; [2, 3, 4, 5, 6]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [1, 2, 3, 4, 5]</span></span></span></code></pre></div><p>To modify the elements/array in-place, add an exclamation point:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">map!</span> <span class="p">{</span> <span class="o">|</span><span class="n">i</span><span class="o">|</span> <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="c1">#  =&gt; [2, 3, 4, 5, 6]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [2, 3, 4, 5, 6]</span></span></span></code></pre></div><p>Here&rsquo;s another example where string names in an array are capitalized appropriately:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">names</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;nelson&#34;</span><span class="p">,</span> <span class="s2">&#34;cindy&#34;</span><span class="p">,</span> <span class="s2">&#34;john&#34;</span><span class="p">,</span> <span class="s2">&#34;sophia&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">names</span><span class="o">.</span><span class="n">map!</span> <span class="p">{</span> <span class="o">|</span><span class="nb">name</span><span class="o">|</span> <span class="nb">name</span><span class="o">.</span><span class="n">capitalize</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;Nelson&#34;, &#34;Cindy&#34;, &#34;John&#34;, &#34;Sophia&#34;]</span></span></span></code></pre></div><p>There is a shorthand notation when you want to run a method against all elements in an array. We can use <code>&amp;:method_name</code>. The following example achieves the exact same thing as the previous example:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">names</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;nelson&#34;</span><span class="p">,</span> <span class="s2">&#34;cindy&#34;</span><span class="p">,</span> <span class="s2">&#34;john&#34;</span><span class="p">,</span> <span class="s2">&#34;sophia&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">names</span><span class="o">.</span><span class="n">map!</span><span class="p">(</span><span class="o">&amp;</span><span class="ss">:capitalize</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;Nelson&#34;, &#34;Cindy&#34;, &#34;John&#34;, &#34;Sophia&#34;]</span></span></span></code></pre></div><p>Here&rsquo;s another example using shorthand notation to convert all strings to symbols:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="p">,</span> <span class="s2">&#34;D&#34;</span><span class="p">,</span> <span class="s2">&#34;E&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">map!</span><span class="p">(</span><span class="o">&amp;</span><span class="ss">:to_sym</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [:A, :B, :C, :D, :E]</span></span></span></code></pre></div><p>If you want to do more advanced things, like modify elements conditionally, you will need to stick to the long format. This example replaces all <code>nil</code> elements with <code>0</code> but leaves other elements unchanged:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">data</span> <span class="o">=</span> <span class="o">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="kp">nil</span><span class="p">,</span> <span class="mi">400</span><span class="p">,</span> <span class="mi">500</span><span class="p">,</span> <span class="kp">nil</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">data</span><span class="o">.</span><span class="n">map!</span> <span class="p">{</span> <span class="o">|</span><span class="n">i</span><span class="o">|</span> <span class="n">i</span><span class="o">.</span><span class="n">nil?</span> <span class="p">?</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span> <span class="p">:</span> <span class="n">i</span> <span class="o">=</span> <span class="n">i</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [100, 200, 0, 400, 500, 0]</span></span></span></code></pre></div><h2 id="other-things-to-know">Other Things to Know</h2>
<h3 id="arrays-can-contain-multiple-types">Arrays Can Contain Multiple Types</h3>
<p>For example:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">&lt;&lt;</span> <span class="s2">&#34;a&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">&lt;&lt;</span> <span class="ss">:my_symbol</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">&lt;&lt;</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">&lt;&lt;</span> <span class="p">{</span><span class="ss">hash_key</span><span class="p">:</span> <span class="s2">&#34;hash_value&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [1, &#34;a&#34;, :my_symbol, [1, 2], {:hash_key=&gt;&#34;hash_value&#34;}]</span></span></span></code></pre></div><h3 id="getting-the-index-of-an-element">Getting the Index of an Element</h3>
<p>Use <code>index()</code> and pass in the element you are looking for to retrieve its index.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s2">&#34;B&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; 1</span></span></span></code></pre></div><p>If there are multiple occurrences of an element, <code>index()</code> will return the index of the first occurrence of the element:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s2">&#34;B&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; 1</span></span></span></code></pre></div><p>If an element isn&rsquo;t present in the array, <code>index()</code> returns <code>nil</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s2">&#34;Z&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; nil</span></span></span></code></pre></div><h3 id="reversing-elements-in-an-array">Reversing Elements in an Array</h3>
<p>Elements in an array can be reversed with <code>reverse()</code>. This method returns a new array with the elements in reverse order and does not modify the original array:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">reverse</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;C&#34;, &#34;B&#34;, &#34;A&#34;]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;A&#34;, &#34;B&#34;, &#34;C&#34;]</span></span></span></code></pre></div><p>The <code>reverse!()</code> method does the same thing but it modifies the array in-place:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">reverse!</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;C&#34;, &#34;B&#34;, &#34;A&#34;]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;C&#34;, &#34;B&#34;, &#34;A&#34;]</span></span></span></code></pre></div><h3 id="converting-multi-dimensional-array-into-1-dimensional-array">Converting Multi-dimensional Array into 1-dimensional Array</h3>
<p>We can use <code>flatten()</code> to recursively extract elements from all arrays within an array and return an array with only elements. The original array remains unchanged.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="o">[</span><span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="o">]</span><span class="p">,</span> <span class="o">[</span><span class="s2">&#34;D&#34;</span><span class="p">,</span> <span class="o">[</span><span class="s2">&#34;E&#34;</span><span class="p">,</span> <span class="o">[</span><span class="s2">&#34;F&#34;</span><span class="o">]]]]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">flatten</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;A&#34;, &#34;B&#34;, &#34;C&#34;, &#34;D&#34;, &#34;E&#34;, &#34;F&#34;]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;A&#34;, [&#34;B&#34;, &#34;C&#34;], [&#34;D&#34;, [&#34;E&#34;, [&#34;F&#34;]]]]</span></span></span></code></pre></div><p>We can use <code>flatten!()</code> to modify the array in-place:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="o">[</span><span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="o">]</span><span class="p">,</span> <span class="o">[</span><span class="s2">&#34;D&#34;</span><span class="p">,</span> <span class="o">[</span><span class="s2">&#34;E&#34;</span><span class="p">,</span> <span class="o">[</span><span class="s2">&#34;F&#34;</span><span class="o">]]]]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">flatten!</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;A&#34;, &#34;B&#34;, &#34;C&#34;, &#34;D&#34;, &#34;E&#34;, &#34;F&#34;]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [&#34;A&#34;, &#34;B&#34;, &#34;C&#34;, &#34;D&#34;, &#34;E&#34;, &#34;F&#34;]</span></span></span></code></pre></div><h3 id="removing-all-elements-from-array">Removing All Elements from Array</h3>
<p>We can use <code>clear()</code> to remove all elements from an array in-place.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="s2">&#34;A&#34;</span><span class="p">,</span> <span class="s2">&#34;B&#34;</span><span class="p">,</span> <span class="s2">&#34;C&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">clear</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; []</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; []</span></span></span></code></pre></div><blockquote><p><strong>Note:</strong></p><p>Using <code>arr.clear</code> is not the same as setting <code>arr</code> to an empty array.</p>
<p><code>arr.clear</code> modifies the array in-place. All references to <code>arr</code> will be an empty array <code>[]</code>.</p>
<p><code>arr = []</code> creates a new empty array and assigns it to the <code>arr</code> variable. Other references to the original array are left intact.</p>
</blockquote>

<h3 id="removing-nil-elements-from-array">Removing <code>nil</code> Elements from Array</h3>
<p>We can use <code>compact()</code> to remove all <code>nil</code> elements in an array. This method returns a new array.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="kp">nil</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="kp">nil</span><span class="p">,</span> <span class="mi">3</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">compact</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [1, 2, 3]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [1, nil, 2, nil, 3]</span></span></span></code></pre></div><p>We can use <code>compact!()</code> to do the same operation to the array in-place:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">arr</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="kp">nil</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="kp">nil</span><span class="p">,</span> <span class="mi">3</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="n">arr</span><span class="o">.</span><span class="n">compact!</span>
</span></span><span class="line"><span class="cl"><span class="c1"># =&gt; [1, 2, 3]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">arr</span>
</span></span><span class="line"><span class="cl"><span class="c1">#  =&gt; [1, 2, 3]</span></span></span></code></pre></div><h2 id="references">References</h2>
<ul>
<li>

<a href="https://gist.github.com/mkdika/d1a9c72b6d2b86547f2269e82c235e83" target="_blank" rel="noopener">https://gist.github.com/mkdika/d1a9c72b6d2b86547f2269e82c235e83</a></li>
<li>

<a href="https://www.rubyguides.com/2017/07/ruby-sort/" target="_blank" rel="noopener">https://www.rubyguides.com/2017/07/ruby-sort/</a></li>
<li>

<a href="https://apidock.com/ruby/v2_5_5/Enumerable/sort_by" target="_blank" rel="noopener">https://apidock.com/ruby/v2_5_5/Enumerable/sort_by</a></li>
<li>

<a href="https://www.shortcutfoo.com/app/dojos/ruby-arrays/cheatsheet" target="_blank" rel="noopener">https://www.shortcutfoo.com/app/dojos/ruby-arrays/cheatsheet</a></li>
<li>

<a href="https://apidock.com/ruby/Array" target="_blank" rel="noopener">https://apidock.com/ruby/Array</a></li>
<li>

<a href="https://ruby-doc.org/core-3.1.0/Array.html" target="_blank" rel="noopener">https://ruby-doc.org/core-3.1.0/Array.html</a></li>
<li>

<a href="https://www.rubyguides.com/2018/10/ruby-map-method/" target="_blank" rel="noopener">https://www.rubyguides.com/2018/10/ruby-map-method/</a></li>
<li>

<a href="https://womanonrails.com/one-line-map-ruby" target="_blank" rel="noopener">https://womanonrails.com/one-line-map-ruby</a></li>
</ul>
]]></content:encoded></item><item><title>Ruby Hash Key Types Vary Depending on Hash Syntax</title><link>https://nelson.cloud/ruby-hash-key-types-vary-depending-on-hash-syntax/?ref=rss</link><pubDate>Fri, 06 Jan 2023 00:00:00 +0000</pubDate><guid>https://nelson.cloud/ruby-hash-key-types-vary-depending-on-hash-syntax/?ref=rss</guid><description>Key types in Ruby hashes depend on hash syntax.</description><content:encoded><![CDATA[<p>In Ruby, when a hash is created with keys and values, the keys may or may not retain their type depending on the hash syntax.</p>
<p>If a hash is created using &ldquo;hash rocket&rdquo; (<code>=&gt;</code>) notation then the keys will retain their type.
If the hash is written in JSON-style syntax, all keys become symbols.</p>
<p>In both scenarios, values will retain their type.</p>
<p>If a key is added to the hash after the hash has been created, that key will retain its type.
This can lead to situations where a hash has keys that are of multiple data types.</p>
<h2 id="hashes-with-hash-rocket-syntax">Hashes With Hash Rocket Syntax</h2>
<p>In the example below, a hash is created using hash rocket notation:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;A&#39;</span> <span class="o">=&gt;</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;B&#39;</span> <span class="o">=&gt;</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;C&#39;</span> <span class="o">=&gt;</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">puts</span> <span class="n">items</span><span class="o">[</span><span class="s1">&#39;A&#39;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nb">puts</span> <span class="n">items</span><span class="o">.</span><span class="n">keys</span><span class="o">.</span><span class="n">first</span><span class="o">.</span><span class="n">class</span></span></span></code></pre></div><p>The output is:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> ruby script.rb
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">1
</span></span></span><span class="line"><span class="cl"><span class="go">String
</span></span></span></code></pre></div><p>We can see that with hash rocket syntax the <code>A</code> key retained its string type and can be written as a string in <code>items['A']</code>.</p>
<h2 id="hashes-with-json-syntax">Hashes with JSON Syntax</h2>
<p>Let&rsquo;s see what happens if we take the previous example but change the hash syntax to use JSON-style colons:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;A&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;B&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;C&#39;</span><span class="p">:</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">puts</span> <span class="n">items</span><span class="o">[</span><span class="s1">&#39;A&#39;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nb">puts</span> <span class="n">items</span><span class="o">.</span><span class="n">keys</span><span class="o">.</span><span class="n">first</span><span class="o">.</span><span class="n">class</span></span></span></code></pre></div><p>The output is as follows:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> ruby script.rb
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">Symbol
</span></span></span></code></pre></div><p>The empty line above <code>Symbol</code> is not a typo. In this case, <code>items['A']</code> doesn&rsquo;t exist because <code>'A'</code> is a symbol and should be written as <code>:A</code>. As a result, Ruby prints an empty value.</p>
<p>To get the expected value, we need to write <code>A</code> as a symbol inside <code>puts items[]</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;A&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;B&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;C&#39;</span><span class="p">:</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># writing A as a symbol</span>
</span></span><span class="line"><span class="cl"><span class="nb">puts</span> <span class="n">items</span><span class="o">[</span><span class="ss">:A</span><span class="o">]</span></span></span></code></pre></div><p>Now we get the expected output:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> ruby script.rb
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">1
</span></span></span></code></pre></div><p>We can see that JSON syntax turns all keys in the hash into symbols.</p>
<h2 id="mixing-hash-key-data-types">Mixing Hash Key Data Types</h2>
<p>It&rsquo;s possible to mix certain hash key data types (integers, strings, symbols) when using hash rocket syntax:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="mi">1</span> <span class="o">=&gt;</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;B&#39;</span> <span class="o">=&gt;</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="ss">:C</span> <span class="o">=&gt;</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">items</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="o">|</span>
</span></span><span class="line"><span class="cl">  <span class="nb">puts</span> <span class="s2">&#34;</span><span class="si">#{</span><span class="n">key</span><span class="si">}</span><span class="s2">, </span><span class="si">#{</span><span class="n">key</span><span class="o">.</span><span class="n">class</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span></span></span></code></pre></div><p>The output from the code above is:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> ruby script.rb
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">1, Integer
</span></span></span><span class="line"><span class="cl"><span class="go">B, String
</span></span></span><span class="line"><span class="cl"><span class="go">C, Symbol
</span></span></span></code></pre></div><p>However, if we change the hash rockets to colons, the code does not work:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="mi">1</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;B&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="ss">:C</span><span class="p">:</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">items</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="o">|</span>
</span></span><span class="line"><span class="cl">  <span class="nb">puts</span> <span class="s2">&#34;</span><span class="si">#{</span><span class="n">key</span><span class="si">}</span><span class="s2">, </span><span class="si">#{</span><span class="n">key</span><span class="o">.</span><span class="n">class</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span></span></span></code></pre></div><p>The code above throws the error:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> ruby script.rb
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">syntax error, unexpected &#39;:&#39;, expecting =&gt;
</span></span></span></code></pre></div><p>This is because when using JSON syntax the keys must be written as strings (which are then converted to symbols).</p>
<h2 id="key-types-when-they-are-appended-to-hashes">Key Types When They Are Appended to Hashes</h2>
<p>Creating a hash with JSON-style syntax results in all keys being converted to the symbol data type.
However, if keys are added to the hash after creation, we can have keys of different data types.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;A&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;B&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;C&#39;</span><span class="p">:</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">items</span><span class="o">[</span><span class="mi">4</span><span class="o">]</span> <span class="o">=</span> <span class="mi">4</span>
</span></span><span class="line"><span class="cl"><span class="n">items</span><span class="o">[</span><span class="s1">&#39;5&#39;</span><span class="o">]</span> <span class="o">=</span> <span class="mi">5</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">items</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="o">|</span>
</span></span><span class="line"><span class="cl">  <span class="nb">puts</span> <span class="s2">&#34;</span><span class="si">#{</span><span class="n">key</span><span class="si">}</span><span class="s2">, </span><span class="si">#{</span><span class="n">key</span><span class="o">.</span><span class="n">class</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span></span></span></code></pre></div><p>The output is:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> ruby script.rb
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">A, Symbol
</span></span></span><span class="line"><span class="cl"><span class="go">B, Symbol
</span></span></span><span class="line"><span class="cl"><span class="go">C, Symbol
</span></span></span><span class="line"><span class="cl"><span class="go">4, Integer
</span></span></span><span class="line"><span class="cl"><span class="go">5, String
</span></span></span></code></pre></div><p>We can see that the original 3 keys in the <code>items</code> hash were converted to symbols, while the new appended keys retained their data types.</p>
<p>This also works with rocket syntax hashes since they are more flexible about key data types:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;A&#39;</span> <span class="o">=&gt;</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;B&#39;</span> <span class="o">=&gt;</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;C&#39;</span> <span class="o">=&gt;</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">items</span><span class="o">[</span><span class="mi">4</span><span class="o">]</span> <span class="o">=</span> <span class="mi">4</span>
</span></span><span class="line"><span class="cl"><span class="n">items</span><span class="o">[</span><span class="s1">&#39;5&#39;</span><span class="o">]</span> <span class="o">=</span> <span class="mi">5</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">items</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="o">|</span>
</span></span><span class="line"><span class="cl">  <span class="nb">puts</span> <span class="s2">&#34;</span><span class="si">#{</span><span class="n">key</span><span class="si">}</span><span class="s2">, </span><span class="si">#{</span><span class="n">key</span><span class="o">.</span><span class="n">class</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span></span></span></code></pre></div><p>The output is:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">$</span> ruby script.rb
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="go">A, String
</span></span></span><span class="line"><span class="cl"><span class="go">B, String
</span></span></span><span class="line"><span class="cl"><span class="go">C, String
</span></span></span><span class="line"><span class="cl"><span class="go">4, Integer
</span></span></span><span class="line"><span class="cl"><span class="go">5, String
</span></span></span></code></pre></div><p>The difference between the JSON-style hash and the rocket notation hash is that the original 3 keys in the <code>items</code> hash retained their type.</p>
<p>More information in the Ruby docs:</p>
<ul>
<li>

<a href="https://ruby-doc.org/3.1.2/Hash.html" target="_blank" rel="noopener">https://ruby-doc.org/3.1.2/Hash.html</a></li>
</ul>
]]></content:encoded></item><item><title>Sorting Hashes in Ruby</title><link>https://nelson.cloud/sorting-hashes-in-ruby/?ref=rss</link><pubDate>Sun, 04 Dec 2022 00:00:00 +0000</pubDate><guid>https://nelson.cloud/sorting-hashes-in-ruby/?ref=rss</guid><description>Many ways of sorting hashes in Ruby.</description><content:encoded><![CDATA[<h2 id="sorting-hashes-by-key">Sorting Hashes by Key</h2>
<h3 id="ascending-order">Ascending Order</h3>
<p>Let&rsquo;s say we had the following hash:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;b&#34;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;a&#34;</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;c&#34;</span><span class="p">:</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div><p>If we wanted to sort it by keys, we can use the <code>.sort</code> method to sort in ascending order:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;b&#34;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;a&#34;</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;c&#34;</span><span class="p">:</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># sorting the hash by keys. `items` is now an array</span>
</span></span><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="n">items</span><span class="o">.</span><span class="n">sort</span></span></span></code></pre></div><p>The code above will result in <code>items</code> being an array of arrays (sorted alphabetically by keys) that looks like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="o">[[</span><span class="ss">:a</span><span class="p">,</span> <span class="mi">3</span><span class="o">]</span><span class="p">,</span> <span class="o">[</span><span class="ss">:b</span><span class="p">,</span> <span class="mi">2</span><span class="o">]</span><span class="p">,</span> <span class="o">[</span><span class="ss">:c</span><span class="p">,</span> <span class="mi">1</span><span class="o">]]</span></span></span></code></pre></div><h3 id="descending-order">Descending Order</h3>
<p>To sort a hash by key in descending order, we can chain the <code>.reverse</code> method to the previous code:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;b&#34;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;a&#34;</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;c&#34;</span><span class="p">:</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="n">items</span><span class="o">.</span><span class="n">sort</span><span class="o">.</span><span class="n">reverse</span></span></span></code></pre></div><p>The code above turns <code>items</code> into the following:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="o">[[</span><span class="ss">:c</span><span class="p">,</span> <span class="mi">1</span><span class="o">]</span><span class="p">,</span> <span class="o">[</span><span class="ss">:b</span><span class="p">,</span> <span class="mi">2</span><span class="o">]</span><span class="p">,</span> <span class="o">[</span><span class="ss">:a</span><span class="p">,</span> <span class="mi">3</span><span class="o">]]</span></span></span></code></pre></div><h2 id="sorting-hashes-by-value">Sorting Hashes by Value</h2>
<h3 id="ascending-order-1">Ascending Order</h3>
<p>To sort a hash by value, we need to use <code>.sort_by</code> like so:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;b&#34;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;a&#34;</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;c&#34;</span><span class="p">:</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># sorting by values</span>
</span></span><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="n">items</span><span class="o">.</span><span class="n">sort_by</span> <span class="p">{</span> <span class="o">|</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="o">|</span> <span class="n">v</span> <span class="p">}</span></span></span></code></pre></div><p>The code above will result in <code>items</code> being an array once again, but this time sorted by values in ascending order:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="o">[[</span><span class="ss">:c</span><span class="p">,</span> <span class="mi">1</span><span class="o">]</span><span class="p">,</span> <span class="o">[</span><span class="ss">:b</span><span class="p">,</span> <span class="mi">2</span><span class="o">]</span><span class="p">,</span> <span class="o">[</span><span class="ss">:a</span><span class="p">,</span> <span class="mi">3</span><span class="o">]]</span></span></span></code></pre></div><h3 id="descending-order-1">Descending Order</h3>
<p>We can also use <code>.sort_by</code> to sort values in descending order by using <code>-v</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;b&#34;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;a&#34;</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;c&#34;</span><span class="p">:</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># sorting by values in descending order, note the `-v`</span>
</span></span><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="n">items</span><span class="o">.</span><span class="n">sort_by</span> <span class="p">{</span> <span class="o">|</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="o">|</span> <span class="o">-</span><span class="n">v</span> <span class="p">}</span></span></span></code></pre></div><p>The code above transforms <code>items</code> into the following:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="o">[[</span><span class="ss">:a</span><span class="p">,</span> <span class="mi">3</span><span class="o">]</span><span class="p">,</span> <span class="o">[</span><span class="ss">:b</span><span class="p">,</span> <span class="mi">2</span><span class="o">]</span><span class="p">,</span> <span class="o">[</span><span class="ss">:c</span><span class="p">,</span> <span class="mi">1</span><span class="o">]]</span></span></span></code></pre></div><h2 id="side-note-converting-resulting-arrays-to-hashes">Side Note: Converting Resulting Arrays to Hashes</h2>
<p>As a side note: if you still need the result in a hash format, you can convert the resulting array into a hash with <code>.to_h</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;b&#34;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;a&#34;</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;c&#34;</span><span class="p">:</span> <span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># sorting and converting the result to a hash</span>
</span></span><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="n">items</span><span class="o">.</span><span class="n">sort</span><span class="o">.</span><span class="n">to_h</span></span></span></code></pre></div><p>The code above will result in <code>items</code> being a hash again:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="p">{</span><span class="ss">:a</span><span class="o">=&gt;</span><span class="mi">3</span><span class="p">,</span> <span class="ss">:b</span><span class="o">=&gt;</span><span class="mi">2</span><span class="p">,</span> <span class="ss">:c</span><span class="o">=&gt;</span><span class="mi">1</span><span class="p">}</span></span></span></code></pre></div>]]></content:encoded></item><item><title>Iterating Through Hashes in Ruby</title><link>https://nelson.cloud/iterating-through-hashes-in-ruby/?ref=rss</link><pubDate>Thu, 17 Nov 2022 00:00:00 +0000</pubDate><guid>https://nelson.cloud/iterating-through-hashes-in-ruby/?ref=rss</guid><description>Several methods of iterating through Ruby hashes.</description><content:encoded><![CDATA[<p>In my career, I have only seen Ruby hashes being iterated through by declaring both the key and value.
However, there are several ways of approaching hash iterations.</p>
<p>Note that at the time of this writing I&rsquo;m running Ruby 3.1.2.</p>
<h2 id="iterating-with-key-and-value">Iterating With Key and Value</h2>
<p>The most common way I&rsquo;ve seen hash iterations is by declaring both the key and value variables in the loop. The result is as expected:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;A&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;B&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;C&#39;</span><span class="p">:</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">items</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="o">|</span>
</span></span><span class="line"><span class="cl">  <span class="nb">puts</span> <span class="s2">&#34;key: </span><span class="si">#{</span><span class="n">key</span><span class="si">}</span><span class="s2">, value: </span><span class="si">#{</span><span class="n">value</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span></span></span></code></pre></div><p>The code above has the following output:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">key: A, value: 1
</span></span><span class="line"><span class="cl">key: B, value: 2
</span></span><span class="line"><span class="cl">key: C, value: 3</span></span></code></pre></div><h2 id="iterating-with-a-single-variable">Iterating With a Single Variable</h2>
<p>When iterating through a hash and declaring only a single variable, the variable is an array containing the key and value of the hash as elements.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;A&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;B&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;C&#39;</span><span class="p">:</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">items</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">item</span><span class="o">|</span>
</span></span><span class="line"><span class="cl">  <span class="nb">puts</span> <span class="s2">&#34;</span><span class="si">#{</span><span class="n">item</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span></span></span></code></pre></div><p>The code above has the following output:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">[:A, 1]
</span></span><span class="line"><span class="cl">[:B, 2]
</span></span><span class="line"><span class="cl">[:C, 3]</span></span></code></pre></div><p>In this case, the <code>item</code> variable is an array of 2 elements. The keys are Symbols while the values retain their original type.</p>
<p>There is also the <code>.each_pair</code> method, which works exactly the same way:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;A&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;B&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;C&#39;</span><span class="p">:</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">items</span><span class="o">.</span><span class="n">each_pair</span> <span class="k">do</span> <span class="o">|</span><span class="n">pair</span><span class="o">|</span>
</span></span><span class="line"><span class="cl">  <span class="nb">puts</span> <span class="s2">&#34;</span><span class="si">#{</span><span class="n">pair</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span></span></span></code></pre></div><p>The output is exactly the same as before:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">[:A, 1]
</span></span><span class="line"><span class="cl">[:B, 2]
</span></span><span class="line"><span class="cl">[:C, 3]</span></span></code></pre></div><h2 id="iterating-through-keys">Iterating Through Keys</h2>
<p>The keys of a Ruby hash can be retrieved with <code>.keys</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;A&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;B&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;C&#39;</span><span class="p">:</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">puts</span> <span class="n">items</span><span class="o">.</span><span class="n">keys</span></span></span></code></pre></div><p>The code above prints out the following:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">A
</span></span><span class="line"><span class="cl">B
</span></span><span class="line"><span class="cl">C</span></span></code></pre></div><p>If we want to iterate over each key, we can use <code>.keys</code> in a loop:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;A&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;B&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;C&#39;</span><span class="p">:</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">items</span><span class="o">.</span><span class="n">keys</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">key</span><span class="o">|</span>
</span></span><span class="line"><span class="cl">  <span class="nb">puts</span> <span class="n">key</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span></span></span></code></pre></div><p>And the output is exactly the same:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">A
</span></span><span class="line"><span class="cl">B
</span></span><span class="line"><span class="cl">C</span></span></code></pre></div><p>Finally, there is also the <code>.each_key</code> method that works the same way and is recommended by 

<a href="https://rubocop.org/" target="_blank" rel="noopener">Rubocop</a>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;A&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;B&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;C&#39;</span><span class="p">:</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">items</span><span class="o">.</span><span class="n">each_key</span> <span class="k">do</span> <span class="o">|</span><span class="n">key</span><span class="o">|</span>
</span></span><span class="line"><span class="cl">  <span class="nb">puts</span> <span class="n">key</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span></span></span></code></pre></div><p>Once again, the output is the same:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">A
</span></span><span class="line"><span class="cl">B
</span></span><span class="line"><span class="cl">C</span></span></code></pre></div><h2 id="iterating-through-values">Iterating Through Values</h2>
<p>Like with keys, the values of a hash can be retrieved with <code>.values</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;A&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;B&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;C&#39;</span><span class="p">:</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">puts</span> <span class="n">items</span><span class="o">.</span><span class="n">values</span></span></span></code></pre></div><p>The code above outputs the following:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">1
</span></span><span class="line"><span class="cl">2
</span></span><span class="line"><span class="cl">3</span></span></code></pre></div><p>We can use <code>.values</code> to iterate through the values of a hash:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;A&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;B&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;C&#39;</span><span class="p">:</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">items</span><span class="o">.</span><span class="n">values</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">value</span><span class="o">|</span>
</span></span><span class="line"><span class="cl">  <span class="nb">puts</span> <span class="n">value</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span></span></span></code></pre></div><p>The output is the same:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">1
</span></span><span class="line"><span class="cl">2
</span></span><span class="line"><span class="cl">3</span></span></code></pre></div><p>There is also the <code>.each_value</code> method that achieves the same result and is also recommended by 

<a href="https://rubocop.org/" target="_blank" rel="noopener">Rubocop</a>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="n">items</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;A&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;B&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;C&#39;</span><span class="p">:</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">items</span><span class="o">.</span><span class="n">each_value</span> <span class="k">do</span> <span class="o">|</span><span class="n">value</span><span class="o">|</span>
</span></span><span class="line"><span class="cl">  <span class="nb">puts</span> <span class="n">value</span>
</span></span><span class="line"><span class="cl"><span class="k">end</span></span></span></code></pre></div><p>Once again, the output is exactly the same as before:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">1
</span></span><span class="line"><span class="cl">2
</span></span><span class="line"><span class="cl">3</span></span></code></pre></div>]]></content:encoded></item><item><title>Set a Default Ruby Version with Ruby Version Manager (RVM)</title><link>https://nelson.cloud/set-a-default-ruby-version-with-ruby-version-manager-rvm/?ref=rss</link><pubDate>Sun, 06 Nov 2022 00:00:00 +0000</pubDate><guid>https://nelson.cloud/set-a-default-ruby-version-with-ruby-version-manager-rvm/?ref=rss</guid><description>Set a default Ruby version using RVM with rvm &amp;ndash;default use &lt;version number&gt;</description><content:encoded><![CDATA[<p>To set the system-wide version of Ruby with <code>rvm</code> run:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">rvm --default use &lt;version number&gt;</span></span></code></pre></div><p>For example, to use 3.1.2 as the default version system-wide, run:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">rvm --default use 3.1.2</span></span></code></pre></div><p>Now this version will be used even when a new terminal tab or window is opened.</p>
<p>References:</p>
<ul>
<li>

<a href="https://rvm.io/rubies/default" target="_blank" rel="noopener">https://rvm.io/rubies/default</a></li>
</ul>
]]></content:encoded></item><item><title>Useful Constants in Ruby's Date Class</title><link>https://nelson.cloud/useful-constants-in-rubys-date-class/?ref=rss</link><pubDate>Thu, 20 Aug 2020 00:00:00 +0000</pubDate><guid>https://nelson.cloud/useful-constants-in-rubys-date-class/?ref=rss</guid><description>Diving into useful constants in Ruby&amp;rsquo;s Date class</description><content:encoded><![CDATA[<p>While trying to modify dates in string form, I came across a convenient way to convert months into their numerical values.
For example, say I had the string <code>Aug 20, 2020</code> and I wanted to convert it into <code>8-20-2020</code>.
It&rsquo;s easy to split the string and add a dash in between each number. But what about <code>Aug</code>? How do we get the numerical form of <code>Aug</code> and all the other months?
We could manually create something like a hash that contains months in string and numerical form. But, Ruby already comes with a built-in solution.</p>
<p>In 

<a href="https://ruby-doc.org/stdlib-2.7.1/libdoc/date/rdoc/Date.html#Constants" target="_blank" rel="noopener">the documentation</a>, I discovered that Ruby&rsquo;s <code>Date</code> class comes with two array constants that can help in this situation.
Those constants are <code>MONTHNAMES</code> and <code>ABBR_MONTHNAMES</code>.</p>
<p><code>MONTHNAMES</code> is an array of the full names of all the months.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="c1"># irb</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nb">require</span> <span class="s1">&#39;date&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">=&gt;</span> <span class="kp">true</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="no">Date</span><span class="o">::</span><span class="no">MONTHNAMES</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">=&gt;</span> <span class="o">[</span><span class="kp">nil</span><span class="p">,</span> <span class="s2">&#34;January&#34;</span><span class="p">,</span> <span class="s2">&#34;February&#34;</span><span class="p">,</span> <span class="s2">&#34;March&#34;</span><span class="p">,</span> <span class="s2">&#34;April&#34;</span><span class="p">,</span> <span class="s2">&#34;May&#34;</span><span class="p">,</span> <span class="s2">&#34;June&#34;</span><span class="p">,</span> <span class="s2">&#34;July&#34;</span><span class="p">,</span> <span class="s2">&#34;August&#34;</span><span class="p">,</span> <span class="s2">&#34;September&#34;</span><span class="p">,</span> <span class="s2">&#34;October&#34;</span><span class="p">,</span> <span class="s2">&#34;November&#34;</span><span class="p">,</span> <span class="s2">&#34;December&#34;</span><span class="o">]</span></span></span></code></pre></div><p><code>ABBR_MONTHNAMES</code> is an array of abbreviated month names.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="c1"># irb</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nb">require</span> <span class="s1">&#39;date&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">=&gt;</span> <span class="kp">true</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="no">Date</span><span class="o">::</span><span class="no">ABBR_MONTHNAMES</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">=&gt;</span> <span class="o">[</span><span class="kp">nil</span><span class="p">,</span> <span class="s2">&#34;Jan&#34;</span><span class="p">,</span> <span class="s2">&#34;Feb&#34;</span><span class="p">,</span> <span class="s2">&#34;Mar&#34;</span><span class="p">,</span> <span class="s2">&#34;Apr&#34;</span><span class="p">,</span> <span class="s2">&#34;May&#34;</span><span class="p">,</span> <span class="s2">&#34;Jun&#34;</span><span class="p">,</span> <span class="s2">&#34;Jul&#34;</span><span class="p">,</span> <span class="s2">&#34;Aug&#34;</span><span class="p">,</span> <span class="s2">&#34;Sep&#34;</span><span class="p">,</span> <span class="s2">&#34;Oct&#34;</span><span class="p">,</span> <span class="s2">&#34;Nov&#34;</span><span class="p">,</span> <span class="s2">&#34;Dec&#34;</span><span class="o">]</span></span></span></code></pre></div><p>In my situation, <code>ABBR_MONTHNAMES</code> will solve my problem since the data I&rsquo;m parsing contains abbreviated month names.
Now, when parsing <code>Aug 20, 2020</code>, I can run the following to get a numerical value for <code>Aug</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="c1"># irb</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="nb">require</span> <span class="s1">&#39;date&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">=&gt;</span> <span class="kp">true</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">&gt;</span> <span class="no">Date</span><span class="o">::</span><span class="no">ABBR_MONTHNAMES</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s1">&#39;Aug&#39;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">=&gt;</span> <span class="mi">8</span></span></span></code></pre></div><p>No need to create a hash or array myself, this constant gets the job done.</p>
<p>I noticed both arrays have <code>nil</code> as their first value. At first I asked &ldquo;why?&rdquo;, but it quickly became clear that the <code>nil</code> values are simply filler to take up index <code>0</code> since there is no month with this numerical value.</p>
<p>This was a nice discovery. Ruby continues to make writing code a pleasant experience.</p>
]]></content:encoded></item></channel></rss>