<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kelly Popko</title>
    <description>The latest articles on DEV Community by Kelly Popko (@kelpopko).</description>
    <link>https://dev.to/kelpopko</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F804250%2Fc98c8d24-6bbd-4195-9df9-792eb852576c.jpg</url>
      <title>DEV Community: Kelly Popko</title>
      <link>https://dev.to/kelpopko</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kelpopko"/>
    <language>en</language>
    <item>
      <title>Taskwarrior: Track your TODO list from the Command Line</title>
      <dc:creator>Kelly Popko</dc:creator>
      <pubDate>Thu, 09 Oct 2025 01:00:21 +0000</pubDate>
      <link>https://dev.to/kelpopko/track-your-todo-list-from-the-command-line-taskwarrior-2ngc</link>
      <guid>https://dev.to/kelpopko/track-your-todo-list-from-the-command-line-taskwarrior-2ngc</guid>
      <description>&lt;p&gt;Taskwarrior describes itself as a 'Free and Open Source Software that tracks your TODO list from the command line'.&lt;/p&gt;

&lt;p&gt;This post will touch on installing Taskwarrior and how to do the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a task&lt;/li&gt;
&lt;li&gt;List tasks&lt;/li&gt;
&lt;li&gt;Mark a task as done&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Taskwarrior can be downloaded and 'built' or installed using a package manager.&lt;br&gt;
See Taskwarrior’s &lt;a href="https://taskwarrior.org/download/" rel="noopener noreferrer"&gt;Download&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;Mac / Homebrew users can use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;task
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to use Taskwarrior
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cheat sheet&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Action&lt;/td&gt;
&lt;td&gt;Syntax&lt;/td&gt;
&lt;td&gt;Example&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add a task&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;task add "Task name/description"&lt;/code&gt; (quotation marks optional)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;task add "Add unit tests to project"&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mark a task as done&lt;/td&gt;
&lt;td&gt;&lt;code&gt;task &amp;lt;task-id&amp;gt; done&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;task 5 done&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List tasks&lt;/td&gt;
&lt;td&gt;&lt;code&gt;task list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;task list&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Add a Task&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ task add &lt;span class="s1"&gt;'Research history of the One Ring'&lt;/span&gt;
Created task 1.

❯ task add Rally allies &lt;span class="k"&gt;in &lt;/span&gt;Rohan and Gondor
Created task 2.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: We can use or &lt;em&gt;omit&lt;/em&gt; quotation marks for the task description.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;List Tasks&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ task list

ID  Age   Due   Description                       Urg
1   9min        Research &lt;span class="nb"&gt;history &lt;/span&gt;of the One Ring  0
2   8min        Rally allies &lt;span class="k"&gt;in &lt;/span&gt;Rohan and Gondor  0

2 tasks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that there is no 'Due' date and the urgency 'Urg' is set to 0.&lt;br&gt;
We will look at these in an upcoming post.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Complete a Task&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ task 1 &lt;span class="k"&gt;done
&lt;/span&gt;Completed task 8e04e458 &lt;span class="s1"&gt;'Research history of the One Ring'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Completed 1 task.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ task list

ID  Age   Due   Description                       Urg
1   8min        Rally allies &lt;span class="k"&gt;in &lt;/span&gt;Rohan and Gondor  0

1 task
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observe only the 'Rally' task present, and it has an &lt;code&gt;ID&lt;/code&gt; of &lt;code&gt;1&lt;/code&gt;.&lt;/p&gt;




&lt;p&gt;Now we have enough information to use Taskwarrior as a TODO tool from the command line. Woohoo!&lt;/p&gt;

&lt;p&gt;What would be even more helpful?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The ability to organize our tasks--by project or due date, for example.&lt;/li&gt;
&lt;li&gt;The ability to track &lt;em&gt;how long&lt;/em&gt; tasks and projects take.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will look at both points in the upcoming articles.&lt;/p&gt;

&lt;p&gt;If you do, please share in the comments your tips and workflow!&lt;/p&gt;

&lt;p&gt;This post was inspired by the daily challenge of managing competing priorities with limited time.&lt;/p&gt;

&lt;p&gt;Thank you to my mentor, Victor Goff (KOTP), for telling me about Timewarrior, Taskwarrior, and showing me how he uses them together.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://taskwarrior.org/download/" rel="noopener noreferrer"&gt;Taskwarrior Downloads (Install)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://taskwarrior.org/tutorial/" rel="noopener noreferrer"&gt;Taskwarrior Beginners Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://taskwarrior.org/docs/" rel="noopener noreferrer"&gt;Taskwarrior Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>taskwarrior</category>
      <category>productivity</category>
      <category>cli</category>
    </item>
    <item>
      <title>Timewarrior: Track time from the Command Line</title>
      <dc:creator>Kelly Popko</dc:creator>
      <pubDate>Sun, 21 Sep 2025 00:15:09 +0000</pubDate>
      <link>https://dev.to/kelpopko/timewarrior-track-time-from-the-command-line-46c5</link>
      <guid>https://dev.to/kelpopko/timewarrior-track-time-from-the-command-line-46c5</guid>
      <description>&lt;p&gt;Timewarrior describes itself as a 'Free and Open Source Software that tracks time from the command line'.&lt;/p&gt;

&lt;p&gt;This article will touch on installation and cover just enough here to get your feet wet.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to start recording&lt;/li&gt;
&lt;li&gt;How to stop recording&lt;/li&gt;
&lt;li&gt;How to view the summary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Timewarrior can be installed manually or using a package manager.&lt;br&gt;
See their &lt;a href="https://timewarrior.net/docs/install/" rel="noopener noreferrer"&gt;Install&lt;/a&gt; page for options.&lt;/p&gt;

&lt;p&gt;Mac / Homebrew users can use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;timewarrior
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  How to use Timewarrior
&lt;/h4&gt;

&lt;p&gt;Let’s say we want to track how much time we spend reading a book--Sandi Metz’s &lt;em&gt;Practical Object Oriented Design in Ruby&lt;/em&gt; (POODR).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start the timer&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ timew start &lt;span class="s2"&gt;"Read POODR"&lt;/span&gt;
Tracking &lt;span class="s2"&gt;"Read POODR"&lt;/span&gt;
  Started 2025-09-18T20:08:47
  Current                  47
  Total               0:00:00
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To stop the timer, we &lt;em&gt;can&lt;/em&gt; specify the task (but we do not need to).&lt;br&gt;
Timewarrior records one task at a time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stop the timer&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ timew stop
Recorded &lt;span class="s2"&gt;"Read POODR"&lt;/span&gt;
  Started 2025-09-18T20:10:50
  Ended                    57
  Total               0:00:07
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can also view a summary of time spent on various items.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get a Summary for the Day&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ timew summary

Wk  Date        Day ID Tags Annotation    Start      End     Time    Total
W37 2025-09-18  Thu @3      Read POODR 20:08:47 20:10:32  0:01:45  0:01:45
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Timewarrior is a new tool to me and there is more we can do with it.&lt;br&gt;
Check out the &lt;a href="https://timewarrior.net/tutorial/" rel="noopener noreferrer"&gt;tutorial&lt;/a&gt; and &lt;a href="https://timewarrior.net/docs/" rel="noopener noreferrer"&gt;docs&lt;/a&gt; linked below.&lt;/p&gt;

&lt;p&gt;In future posts, I will share how to use related-tool Taskwarrior, and how to use them together.&lt;/p&gt;

&lt;p&gt;This post was inspired by the daily challenge of managing competing priorities with limited time.&lt;/p&gt;

&lt;p&gt;Thank you to my mentor, Victor Goff (KOTP), for telling me about Timewarrior, Taskwarrior, and showing me how he uses them together.&lt;/p&gt;

&lt;p&gt;I have only recently started using them--admittedly, too recently for me to benefit much from the reporting.&lt;br&gt;
That said, the process of tracking and the flexibility--especially combined with Taskwarrior--has already been very beneficial.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://timewarrior.net/docs/install/" rel="noopener noreferrer"&gt;Timewarrior Install&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://timewarrior.net/tutorial/" rel="noopener noreferrer"&gt;Timewarrior Beginners Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://timewarrior.net/docs/" rel="noopener noreferrer"&gt;Timewarrior Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>timewarrior</category>
      <category>productivity</category>
      <category>timetracking</category>
      <category>cli</category>
    </item>
    <item>
      <title>Ruby Data Class: Immutability Workarounds/</title>
      <dc:creator>Kelly Popko</dc:creator>
      <pubDate>Mon, 11 Aug 2025 15:59:22 +0000</pubDate>
      <link>https://dev.to/kelpopko/ruby-data-class-immutability-workarounds-2p32</link>
      <guid>https://dev.to/kelpopko/ruby-data-class-immutability-workarounds-2p32</guid>
      <description>&lt;p&gt;&lt;em&gt;This is part 3 in this series on Ruby's Data Class. Part 1 covered &lt;a href="https://dev.to/kelpopko/ruby-data-class-syntax-dio"&gt;Syntax&lt;/a&gt; and part 2 &lt;a href="https://dev.to/kelpopko/ruby-data-class-vs-struct-44o8"&gt;compared Data with Struct&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Immutability Workarounds, Sort of
&lt;/h2&gt;

&lt;p&gt;We &lt;em&gt;can&lt;/em&gt; work (arguably) against the intent of &lt;code&gt;Data&lt;/code&gt; in some ways.&lt;/p&gt;

&lt;p&gt;For example, when an attribute is set to a &lt;code&gt;Hash&lt;/code&gt;, we can update values in the hash.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;ColorCounts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:color_tally&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; Colorcounts&lt;/span&gt;

&lt;span class="n"&gt;screen_colors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ColorCounts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="ss"&gt;red: &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;blue: &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;green: &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; #&amp;lt;data ColorCounts color_tally={:red=&amp;gt;0, :blue=&amp;gt;0, :green=&amp;gt;0}&amp;gt;&lt;/span&gt;

&lt;span class="c1"&gt;# Update a value in `color_tally`&lt;/span&gt;
&lt;span class="n"&gt;screen_colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;color_tally&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:red&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; 5&lt;/span&gt;

&lt;span class="c1"&gt;# Note that the value for  `:red` has been updated&lt;/span&gt;
&lt;span class="n"&gt;screen_colors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;color_tally&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; {:red=&amp;gt;5, :blue=&amp;gt;0, :green=&amp;gt;0}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can also workaround to update a (non-frozen) string.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; Person&lt;/span&gt;

&lt;span class="n"&gt;me&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;name: &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s1"&gt;'Popko'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; #&amp;lt;data Person name="Popko"&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;me&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;prepend&lt;/span&gt; &lt;span class="s1"&gt;'Kelly '&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; 'Kelly Popko'&lt;/span&gt;

&lt;span class="n"&gt;me&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; 'Kelly Popko'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So we are not completely without the ability to modify or create certain workarounds.&lt;/p&gt;

&lt;p&gt;However, when we need more flexibility or mutability, for example, we would want to choose &lt;code&gt;class&lt;/code&gt; or something else more suited to what we need &lt;em&gt;instead&lt;/em&gt; of trying to work around it with &lt;code&gt;Data&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Using a Data object communicates the intent of the object to current and future collaborators.&lt;/p&gt;

&lt;p&gt;Data is a great choice when you want to avoid a mutated value on the object coming back to haunt you.&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>immutability</category>
      <category>valueobjects</category>
      <category>datastructures</category>
    </item>
    <item>
      <title>Ruby Data Class vs Struct</title>
      <dc:creator>Kelly Popko</dc:creator>
      <pubDate>Sat, 09 Aug 2025 19:58:15 +0000</pubDate>
      <link>https://dev.to/kelpopko/ruby-data-class-vs-struct-44o8</link>
      <guid>https://dev.to/kelpopko/ruby-data-class-vs-struct-44o8</guid>
      <description>&lt;p&gt;&lt;em&gt;This is part 2 in this series on Ruby's Data Class. Part 1 covered &lt;a href="https://dev.to/kelpopko/ruby-data-class-syntax-dio"&gt;Syntax&lt;/a&gt; and part 3 explores &lt;a href="https://dev.to/kelpopko/ruby-data-class-immutability-workarounds-2p32"&gt;immutability workarounds with Data&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In practice, a main difference between instances of Data and Struct is mutability:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instances of Data are immutable*&lt;/li&gt;
&lt;li&gt;Instances of Struct are mutable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;*Mutable values passed to instances of Data remain immutable by default.&lt;/p&gt;

&lt;p&gt;Data also has fewer (and different) 'built-in' methods than Struct.&lt;/p&gt;

&lt;p&gt;This post explores differences in syntax and behavior between Data and Struct.&lt;/p&gt;

&lt;h2&gt;
  
  
  Syntax comparison: Create New Instance
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Data
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;House&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:rooms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:area&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:floors&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ranch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;House&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;rooms: &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;area: &lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;floors: &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; #&amp;lt;data House rooms=5, area=1200, floors=1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Struct
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;House&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Struct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:rooms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:area&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:floors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;keyword_init: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ranch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;House&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;rooms: &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;area: &lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;floors: &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; #&amp;lt;struct House rooms=5, area=1200, floors=1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Mutability: Attempt to Renovate the house...
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Data
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;House&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:rooms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:area&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:floors&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ranch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;House&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;rooms: &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;area: &lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;floors: &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; #&amp;lt;data House rooms=5, area=1200, floors=1&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;ranch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="c1"&gt;# (irb):3:in `&amp;lt;main&amp;gt;': undefined method `floors=' for an instance of House (NoMethodError)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells us there is no 'writer' (sometimes called "setter" in other&lt;br&gt;
languages) method to use.&lt;/p&gt;

&lt;p&gt;If we try to define a writer method on &lt;code&gt;House&lt;/code&gt; and update that value, &lt;code&gt;FrozenError&lt;/code&gt; is raised.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;House&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:rooms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:area&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:floors&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;floors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@floors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;quantity&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; House&lt;/span&gt;

&lt;span class="n"&gt;cottage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;House&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;rooms: &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;area: &lt;/span&gt;&lt;span class="mi"&gt;700&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;floors: &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; #&amp;lt;data House rooms=5, area=700, floors=1&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;cottage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="c1"&gt;# (irb):21:in `floors=': can't modify frozen House: #&amp;lt;data House rooms=5, area=700, floors=1&amp;gt; (FrozenError)&lt;/span&gt;
&lt;span class="n"&gt;cottage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;frozen?&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What we &lt;em&gt;can&lt;/em&gt; do with a Data object is clone it and update any of the attribute values.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;House&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:rooms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:area&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:floors&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cottage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;House&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;rooms: &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;area: &lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;floors: &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; #&amp;lt;data House rooms=5, area=1200, floors=1&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;two_story_cottage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cottage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;floors: &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; #&amp;lt;data House rooms=5, area=1200, floors=2&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Struct
&lt;/h3&gt;

&lt;p&gt;With Struct, we can renovate.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;House&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Struct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:rooms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:area&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:floors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;keyword_init: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ranch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;House&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;rooms: &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;area: &lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;floors: &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; #&amp;lt;struct House rooms=5, area=1200, floors=1&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;ranch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; 2&lt;/span&gt;

&lt;span class="n"&gt;ranch&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; #&amp;lt;struct House rooms=5, area=1200, floors=2&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;ranch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;frozen?&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Built-in Methods
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Data Class
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:define&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instance_methods&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:deconstruct_keys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:pretty_print&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:pretty_print_cycle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:deconstruct&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:==&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:inspect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:members&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:to_s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:with&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:eql?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:to_h&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Struct
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Struct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:new&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Struct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instance_methods&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:deconstruct_keys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:==&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:members&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:to_a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:to_s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:[]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:[]=&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:values_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:eql?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:to_h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:select&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:filter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:pretty_print&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:pretty_print_cycle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:deconstruct&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:inspect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:each_pair&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:dig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:each&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Comparison
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;struct_methods&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;data_methods&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:to_a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:[]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:[]=&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:values_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:select&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:filter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:each_pair&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:values&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:dig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="ss"&gt;:each&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;data_methods&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;struct_methods&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:with&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>ruby</category>
      <category>rubydata</category>
      <category>rubystruct</category>
      <category>oop</category>
    </item>
    <item>
      <title>Ruby Data Class: Syntax</title>
      <dc:creator>Kelly Popko</dc:creator>
      <pubDate>Mon, 21 Jul 2025 23:04:47 +0000</pubDate>
      <link>https://dev.to/kelpopko/ruby-data-class-syntax-dio</link>
      <guid>https://dev.to/kelpopko/ruby-data-class-syntax-dio</guid>
      <description>&lt;p&gt;&lt;em&gt;This is part 1 in this series on Ruby's Data Class. Part 2 &lt;a href="https://dev.to/kelpopko/ruby-data-class-vs-struct-44o8"&gt;compares Data with Struct&lt;/a&gt;. Part 3 explores &lt;a href="https://dev.to/kelpopko/ruby-data-class-immutability-workarounds-2p32"&gt;immutability workarounds with Data&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the Data class?
&lt;/h3&gt;

&lt;p&gt;A Ruby class to allow the definition of simple classes for value-alike objects.&lt;/p&gt;

&lt;p&gt;Data is &lt;em&gt;intended&lt;/em&gt; to store immutable values*. &lt;br&gt;
Once defined, its instance cannot &lt;br&gt;
*A future post will explore the wiggle room here.&lt;/p&gt;

&lt;p&gt;Once defined, the instance of Data class is &lt;/p&gt;

&lt;p&gt;A Ruby class designed to create for objects with the intention of being immutable.&lt;/p&gt;

&lt;p&gt;The Data class was introduced to Ruby in Ruby 3.2, to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;'define simple classes for value-alike'&lt;/li&gt;
&lt;li&gt;store immutable atomic values&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  When was Data brought into Ruby?
&lt;/h3&gt;

&lt;p&gt;Ruby 3.2&lt;/p&gt;
&lt;h3&gt;
  
  
  Create the blueprint (instance of Data class)
&lt;/h3&gt;

&lt;p&gt;We call &lt;code&gt;Data.define&lt;/code&gt; and pass keyword arguments.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Book&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:author&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:year&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can define methods as well if we pass it a block.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Book&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:author&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:year&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="no"&gt;SUMMARY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'%&amp;lt;title&amp;gt;s was written by %&amp;lt;author&amp;gt;s in %&amp;lt;year&amp;gt;i.'&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;to_s&lt;/span&gt;
    &lt;span class="no"&gt;SUMMARY&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:,&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:,&lt;/span&gt; &lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;:}&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;hobbit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"The Hobbit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"J.R.R. Tolkien"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1937&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;hobbit&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; nil&lt;/span&gt;
&lt;span class="s1"&gt;'The Hobbit was written by J.R.R. Tolkien in 1937.'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Building from the blueprint
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Call &lt;code&gt;.new&lt;/code&gt; or use &lt;code&gt;[]&lt;/code&gt; notation&lt;/li&gt;
&lt;li&gt;Use keyword or positional arguments&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;.new&lt;/code&gt; + keyword arguments
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;hobbit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;title: &lt;/span&gt;&lt;span class="s2"&gt;"The Hobbit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;author: &lt;/span&gt;&lt;span class="s2"&gt;"J. R. R. Tolkien"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;year: &lt;/span&gt;&lt;span class="mi"&gt;1937&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; &amp;lt;data Book title="The Hobbit", author="J. R. R. Tolkien", year=1937&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;hobbit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;author&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; "J. R. R. Tolkien"&lt;/span&gt;

&lt;span class="n"&gt;hobbit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;year&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; 1937&lt;/span&gt;

&lt;span class="n"&gt;hobbit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;title&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; "The Hobbit"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Bracket Notation + Positional arguments
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:latitude&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:longitude&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; Location&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can use positional arguments but need to take care with the order.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;philadelphia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;39.9526&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;75.1652&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; #&amp;lt;data Location latitude=39.9526, longitude=-75.1652&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;philadelphia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;latitude&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; 39.9526&lt;/span&gt;

&lt;span class="n"&gt;philadelphia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;75.1652&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;39.9526&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; #&amp;lt;data Location latitude=-75.1652, longitude=39.9526&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;philadelphia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;latitude&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; -75.1652&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Bracket Notation + Keyword Arguments
&lt;/h4&gt;

&lt;p&gt;Note that with keyword arguments, we have flexibility in the order we pass arguments.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;philadelphia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;latitude: &lt;/span&gt;&lt;span class="mf"&gt;39.9526&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;75.1652&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; #&amp;lt;data Location latitude=39.9526, longitude=-75.1652&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;philadelphia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;latitude&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; 39.9526&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;philadelphia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;longitude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;75.1652&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;latitude: &lt;/span&gt;&lt;span class="mf"&gt;39.9526&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; #&amp;lt;data Location latitude=39.9526, longitude=-75.1652&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;philadelphia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;latitude&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; 39.9526&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Further Reading
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.ruby-lang.org/en/3.4/Data.html" rel="noopener noreferrer"&gt;Official Ruby Data Class Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bugs.ruby-lang.org/issues/16122" rel="noopener noreferrer"&gt;Ruby Feature Proposal #16122 — Data Class&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ruby/ruby/pull/6353" rel="noopener noreferrer"&gt;Ruby Data Class — Pull Request #6353&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ruby</category>
    </item>
    <item>
      <title>IRB and `ls` to inspect object</title>
      <dc:creator>Kelly Popko</dc:creator>
      <pubDate>Wed, 09 Jul 2025 00:04:35 +0000</pubDate>
      <link>https://dev.to/kelpopko/ls-to-inspect-object-58gg</link>
      <guid>https://dev.to/kelpopko/ls-to-inspect-object-58gg</guid>
      <description>&lt;p&gt;Today I learned we can use &lt;code&gt;ls&lt;/code&gt; to...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Show methods, constants, and variables. &lt;a href="https://ruby.github.io/irb/?search=%2Fls#label-Commands" rel="noopener noreferrer"&gt;Ruby 3.2 Official Documentation IRB Commands&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Examples
&lt;/h2&gt;

&lt;p&gt;Looking at a class &lt;code&gt;Greeting&lt;/code&gt; I created:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="sc"&gt;?&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Greeting&lt;/span&gt;
&lt;span class="sc"&gt;?&amp;gt;&lt;/span&gt;   &lt;span class="nb"&gt;attr_accessor&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;
&lt;span class="sc"&gt;?&amp;gt;&lt;/span&gt;
&lt;span class="sc"&gt;?&amp;gt;&lt;/span&gt;   &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="sc"&gt;?&amp;gt;&lt;/span&gt;     &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
&lt;span class="sc"&gt;?&amp;gt;&lt;/span&gt;   &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="sc"&gt;?&amp;gt;&lt;/span&gt;
&lt;span class="sc"&gt;?&amp;gt;&lt;/span&gt;   &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;to_s&lt;/span&gt;
&lt;span class="sc"&gt;?&amp;gt;&lt;/span&gt;     &lt;span class="s1"&gt;'Hello, %s'&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;
&lt;span class="sc"&gt;?&amp;gt;&lt;/span&gt;   &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:to_s&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ls&lt;/span&gt; &lt;span class="no"&gt;Greeting&lt;/span&gt;
&lt;span class="no"&gt;Greeting&lt;/span&gt;&lt;span class="c1"&gt;#methods: name  name=  speak  to_s&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ls&lt;/span&gt; &lt;span class="no"&gt;Greeting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'foo'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="no"&gt;Greeting&lt;/span&gt;&lt;span class="c1"&gt;#methods: name  name=  speak  to_s&lt;/span&gt;
&lt;span class="n"&gt;instance&lt;/span&gt; &lt;span class="ss"&gt;variables: &lt;/span&gt;&lt;span class="vi"&gt;@name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looking at a built-in Ruby class, &lt;code&gt;Struct&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ls&lt;/span&gt; &lt;span class="no"&gt;Struct&lt;/span&gt;
&lt;span class="no"&gt;Struct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;
&lt;span class="no"&gt;Struct&lt;/span&gt;&lt;span class="c1"&gt;#methods:&lt;/span&gt;
  &lt;span class="o"&gt;==&lt;/span&gt;    &lt;span class="p"&gt;[]&lt;/span&gt;    &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;     &lt;span class="n"&gt;deconstruct&lt;/span&gt;  &lt;span class="n"&gt;deconstruct_keys&lt;/span&gt;  &lt;span class="n"&gt;dig&lt;/span&gt;  &lt;span class="n"&gt;each&lt;/span&gt;  &lt;span class="n"&gt;each_pair&lt;/span&gt;  &lt;span class="nb"&gt;eql?&lt;/span&gt;  &lt;span class="n"&gt;filter&lt;/span&gt;  &lt;span class="nb"&gt;hash&lt;/span&gt;  &lt;span class="nb"&gt;inspect&lt;/span&gt;  &lt;span class="n"&gt;length&lt;/span&gt;  &lt;span class="n"&gt;members&lt;/span&gt;  &lt;span class="n"&gt;pretty_print&lt;/span&gt;  &lt;span class="n"&gt;pretty_print_cycle&lt;/span&gt;  &lt;span class="nb"&gt;select&lt;/span&gt;  &lt;span class="n"&gt;size&lt;/span&gt;  &lt;span class="nb"&gt;to_a&lt;/span&gt;
  &lt;span class="n"&gt;to_h&lt;/span&gt;  &lt;span class="nb"&gt;to_s&lt;/span&gt;  &lt;span class="n"&gt;values&lt;/span&gt;  &lt;span class="n"&gt;values_at&lt;/span&gt;
&lt;span class="no"&gt;Enumerable&lt;/span&gt;&lt;span class="c1"&gt;#methods:&lt;/span&gt;
  &lt;span class="n"&gt;all?&lt;/span&gt;        &lt;span class="n"&gt;any?&lt;/span&gt;        &lt;span class="n"&gt;chain&lt;/span&gt;            &lt;span class="n"&gt;chunk&lt;/span&gt;             &lt;span class="n"&gt;chunk_while&lt;/span&gt;   &lt;span class="n"&gt;collect&lt;/span&gt;     &lt;span class="n"&gt;collect_concat&lt;/span&gt;  &lt;span class="n"&gt;compact&lt;/span&gt;   &lt;span class="n"&gt;count&lt;/span&gt;       &lt;span class="n"&gt;cycle&lt;/span&gt;   &lt;span class="n"&gt;detect&lt;/span&gt;      &lt;span class="n"&gt;drop&lt;/span&gt;   &lt;span class="n"&gt;drop_while&lt;/span&gt;  &lt;span class="n"&gt;each_cons&lt;/span&gt;
  &lt;span class="n"&gt;each_entry&lt;/span&gt;  &lt;span class="n"&gt;each_slice&lt;/span&gt;  &lt;span class="n"&gt;each_with_index&lt;/span&gt;  &lt;span class="n"&gt;each_with_object&lt;/span&gt;  &lt;span class="n"&gt;entries&lt;/span&gt;       &lt;span class="n"&gt;filter_map&lt;/span&gt;  &lt;span class="n"&gt;find&lt;/span&gt;            &lt;span class="n"&gt;find_all&lt;/span&gt;  &lt;span class="n"&gt;find_index&lt;/span&gt;  &lt;span class="n"&gt;first&lt;/span&gt;   &lt;span class="n"&gt;flat_map&lt;/span&gt;    &lt;span class="n"&gt;grep&lt;/span&gt;   &lt;span class="n"&gt;grep_v&lt;/span&gt;      &lt;span class="n"&gt;group_by&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;    &lt;span class="n"&gt;inject&lt;/span&gt;      &lt;span class="n"&gt;lazy&lt;/span&gt;             &lt;span class="n"&gt;map&lt;/span&gt;               &lt;span class="n"&gt;max&lt;/span&gt;           &lt;span class="n"&gt;max_by&lt;/span&gt;      &lt;span class="n"&gt;member?&lt;/span&gt;         &lt;span class="n"&gt;min&lt;/span&gt;       &lt;span class="n"&gt;min_by&lt;/span&gt;      &lt;span class="n"&gt;minmax&lt;/span&gt;  &lt;span class="n"&gt;minmax_by&lt;/span&gt;   &lt;span class="n"&gt;none?&lt;/span&gt;  &lt;span class="n"&gt;one?&lt;/span&gt;        &lt;span class="n"&gt;partition&lt;/span&gt;
  &lt;span class="n"&gt;reduce&lt;/span&gt;      &lt;span class="n"&gt;reject&lt;/span&gt;      &lt;span class="n"&gt;reverse_each&lt;/span&gt;     &lt;span class="n"&gt;slice_after&lt;/span&gt;       &lt;span class="n"&gt;slice_before&lt;/span&gt;  &lt;span class="n"&gt;slice_when&lt;/span&gt;  &lt;span class="n"&gt;sort&lt;/span&gt;            &lt;span class="n"&gt;sort_by&lt;/span&gt;   &lt;span class="n"&gt;sum&lt;/span&gt;         &lt;span class="n"&gt;take&lt;/span&gt;    &lt;span class="n"&gt;take_while&lt;/span&gt;  &lt;span class="n"&gt;tally&lt;/span&gt;  &lt;span class="n"&gt;to_set&lt;/span&gt;      &lt;span class="n"&gt;uniq&lt;/span&gt;
  &lt;span class="n"&gt;zip&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

</description>
      <category>ruby</category>
      <category>irb</category>
      <category>inspect</category>
    </item>
    <item>
      <title>Today I Learned: Unpack a Gem</title>
      <dc:creator>Kelly Popko</dc:creator>
      <pubDate>Mon, 30 Jun 2025 15:18:40 +0000</pubDate>
      <link>https://dev.to/kelpopko/today-i-learned-unpack-a-gem-2lm4</link>
      <guid>https://dev.to/kelpopko/today-i-learned-unpack-a-gem-2lm4</guid>
      <description>&lt;p&gt;Today I learned how to unpack a gem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ gem unpack my-gem-0.0.0.gem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a directory &lt;code&gt;my-gem-0.0.0&lt;/code&gt; we can navigate to &lt;code&gt;cd my-gem-0.0.0&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ &lt;span class="nb"&gt;ls
&lt;/span&gt;my-gem-0.0.0
❯ &lt;span class="nb"&gt;cd &lt;/span&gt;my-gem-0.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From here, we can take a look at the contents.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ &lt;span class="nb"&gt;ls
&lt;/span&gt;bin lib
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: for an unknown gem, consider instead using &lt;code&gt;fetch&lt;/code&gt; to unpack.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Sources&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Developer terms: Factory</title>
      <dc:creator>Kelly Popko</dc:creator>
      <pubDate>Tue, 22 Apr 2025 04:41:48 +0000</pubDate>
      <link>https://dev.to/kelpopko/developer-terms-factory-2ld8</link>
      <guid>https://dev.to/kelpopko/developer-terms-factory-2ld8</guid>
      <description>&lt;p&gt;What makes an object a 'factory'? &lt;/p&gt;

&lt;p&gt;Well, today I learned that a &lt;em&gt;factory&lt;/em&gt; refers to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An object &lt;em&gt;whose purpose is to create other objects&lt;/em&gt; is a factory.... &lt;sup id="fnref1"&gt;1&lt;/sup&gt; (emphasis mine)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Book&lt;/span&gt;
  &lt;span class="nb"&gt;attr_reader&lt;/span&gt; &lt;span class="ss"&gt;:title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:author&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@title&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;
    &lt;span class="vi"&gt;@author&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;BookFactory&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:,&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:)&lt;/span&gt;
    &lt;span class="no"&gt;Book&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this code snippet, &lt;code&gt;BookFactory&lt;/code&gt; is a factory because its (sole) purpose is to create a new instance of &lt;code&gt;Book&lt;/code&gt;.&lt;/p&gt;







&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;S. Metz, Practical object-oriented design: An agile primer using Ruby, 2nd ed. Boston, MA: Addison-Wesley Educational, 2017. ↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>ruby</category>
      <category>programming</category>
      <category>factory</category>
    </item>
  </channel>
</rss>
