summaryrefslogtreecommitdiff
path: root/gemfeed/2025-10-11-the-well-grounded-rubyist-notes.html
diff options
context:
space:
mode:
Diffstat (limited to 'gemfeed/2025-10-11-the-well-grounded-rubyist-notes.html')
-rw-r--r--gemfeed/2025-10-11-the-well-grounded-rubyist-notes.html253
1 files changed, 253 insertions, 0 deletions
diff --git a/gemfeed/2025-10-11-the-well-grounded-rubyist-notes.html b/gemfeed/2025-10-11-the-well-grounded-rubyist-notes.html
new file mode 100644
index 00000000..e9eba28d
--- /dev/null
+++ b/gemfeed/2025-10-11-the-well-grounded-rubyist-notes.html
@@ -0,0 +1,253 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<title>Key Takeaways from The Well-Grounded Rubyist</title>
+<link rel="shortcut icon" type="image/gif" href="/favicon.ico" />
+<link rel="stylesheet" href="../style.css" />
+<link rel="stylesheet" href="style-override.css" />
+</head>
+<body>
+<p class="header">
+<a href="https://foo.zone">Home</a> | <a href="https://codeberg.org/snonux/foo.zone/src/branch/content-md/gemfeed/2025-10-11-the-well-grounded-rubyist-notes.md">Markdown</a> | <a href="gemini://foo.zone/gemfeed/2025-10-11-the-well-grounded-rubyist-notes.gmi">Gemini</a>
+</p>
+<h1 style='display: inline' id='key-takeaways-from-the-well-grounded-rubyist'>Key Takeaways from The Well-Grounded Rubyist</h1><br />
+<br />
+<span class='quote'>Published at 2025-10-11T15:25:14+03:00</span><br />
+<br />
+<span>Some time ago, I wrote about my journey into Ruby and how "The Well-Grounded Rubyist" helped me to get a better understanding of the language. I took a lot of notes while reading the book, and I think it&#39;s time to share some of them. This is not a comprehensive review, but rather a collection of interesting tidbits and concepts that stuck with me.</span><br />
+<br />
+<a class='textlink' href='./2021-07-04-the-well-grounded-rubyist.html'>My first post about the book.</a><br />
+<br />
+<h2 style='display: inline' id='the-object-model'>The Object Model</h2><br />
+<br />
+<span>One of the most fascinating aspects of Ruby is its object model. The book does a great job of explaining the details.</span><br />
+<br />
+<h3 style='display: inline' id='everything-is-an-object-almost'>Everything is an object (almost)</h3><br />
+<br />
+<span>In Ruby, most things are objects. This includes numbers, strings, and even classes themselves. This has some interesting consequences. For example, you can&#39;t use <span class='inlinecode'>i++</span> like in C or Java. Integers are immutable objects. <span class='inlinecode'>1</span> is always the same object. <span class='inlinecode'>1 + 1</span> returns a new object, <span class='inlinecode'>2</span>.</span><br />
+<br />
+<h3 style='display: inline' id='the-self-keyword'>The <span class='inlinecode'>self</span> keyword</h3><br />
+<br />
+<span>There is always a current object, <span class='inlinecode'>self</span>. If you call a method without an explicit receiver, it&#39;s called on <span class='inlinecode'>self</span>. For example, <span class='inlinecode'>puts "hello"</span> is actually <span class='inlinecode'>self.puts "hello"</span>.</span><br />
+<br />
+<!-- Generator: GNU source-highlight 3.1.9
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><i><font color="silver"># At the top level, self is the main object</font></i>
+p <b><u><font color="#000000">self</font></u></b>
+<i><font color="silver"># =&gt; main</font></i>
+p <b><u><font color="#000000">self</font></u></b>.<b><u><font color="#000000">class</font></u></b>
+<i><font color="silver"># =&gt; Object</font></i>
+
+<b><u><font color="#000000">def</font></u></b> foo
+ <i><font color="silver"># Inside a method, self is the object that received the call</font></i>
+ p <b><u><font color="#000000">self</font></u></b>
+<b><u><font color="#000000">end</font></u></b>
+
+foo
+<i><font color="silver"># =&gt; main</font></i>
+</pre>
+<br />
+<span>This code demonstrates how <span class='inlinecode'>self</span> changes depending on the context. At the top level, it&#39;s <span class='inlinecode'>main</span>, an instance of <span class='inlinecode'>Object</span>. When <span class='inlinecode'>foo</span> is called without a receiver, it&#39;s called on <span class='inlinecode'>main</span>.</span><br />
+<br />
+<h3 style='display: inline' id='singleton-methods'>Singleton Methods</h3><br />
+<br />
+<span>You can add methods to individual objects. These are called singleton methods.</span><br />
+<br />
+<!-- Generator: GNU source-highlight 3.1.9
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre>obj = <font color="#808080">"a string"</font>
+
+<b><u><font color="#000000">def</font></u></b> obj.shout
+ <b><u><font color="#000000">self</font></u></b>.upcase + <font color="#808080">"!"</font>
+<b><u><font color="#000000">end</font></u></b>
+
+p obj.shout
+<i><font color="silver"># =&gt; "A STRING!"</font></i>
+
+obj2 = <font color="#808080">"another string"</font>
+<i><font color="silver"># obj2.shout would raise a NoMethodError</font></i>
+</pre>
+<br />
+<span>Here, the <span class='inlinecode'>shout</span> method is only available on the <span class='inlinecode'>obj</span> object. This is a powerful feature for adding behavior to specific instances.</span><br />
+<br />
+<h3 style='display: inline' id='classes-are-objects'>Classes are Objects</h3><br />
+<br />
+<span>Classes themselves are objects, instances of the <span class='inlinecode'>Class</span> class. This means you can create classes dynamically.</span><br />
+<br />
+<!-- Generator: GNU source-highlight 3.1.9
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre>MyClass = Class.new <b><u><font color="#000000">do</font></u></b>
+ <b><u><font color="#000000">def</font></u></b> say_hello
+ puts <font color="#808080">"Hello from a dynamically created class!"</font>
+ <b><u><font color="#000000">end</font></u></b>
+<b><u><font color="#000000">end</font></u></b>
+
+instance = MyClass.new
+instance.say_hello
+<i><font color="silver"># =&gt; Hello from a dynamically created class!</font></i>
+</pre>
+<br />
+<span>This shows how to create a new class and assign it to a constant. This is what happens behind the scenes when you use the <span class='inlinecode'>class</span> keyword.</span><br />
+<br />
+<h2 style='display: inline' id='control-flow-and-methods'>Control Flow and Methods</h2><br />
+<br />
+<span>The book clarified many things about how methods and control flow work in Ruby.</span><br />
+<br />
+<h3 style='display: inline' id='case-and-the--operator'><span class='inlinecode'>case</span> and the <span class='inlinecode'>===</span> operator</h3><br />
+<br />
+<span>The <span class='inlinecode'>case</span> statement is more powerful than I thought. It uses the <span class='inlinecode'>===</span> (threequals or case equality) operator for comparison, not <span class='inlinecode'>==</span>. Different classes can implement <span class='inlinecode'>===</span> in their own way.</span><br />
+<br />
+<!-- Generator: GNU source-highlight 3.1.9
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><i><font color="silver"># For ranges, it checks for inclusion</font></i>
+p (<font color="#000000">1</font>..<font color="#000000">5</font>) === <font color="#000000">3</font> <i><font color="silver"># =&gt; true</font></i>
+
+<i><font color="silver"># For classes, it checks if the object is an instance of the class</font></i>
+p String === <font color="#808080">"hello"</font> <i><font color="silver"># =&gt; true</font></i>
+
+<i><font color="silver"># For regexes, it checks for a match</font></i>
+p /llo/ === <font color="#808080">"hello"</font> <i><font color="silver"># =&gt; true</font></i>
+
+<b><u><font color="#000000">def</font></u></b> check(value)
+ <b><u><font color="#000000">case</font></u></b> value
+ <b><u><font color="#000000">when</font></u></b> String
+ <font color="#808080">"It's a string"</font>
+ <b><u><font color="#000000">when</font></u></b> (<font color="#000000">1</font>..<font color="#000000">10</font>)
+ <font color="#808080">"It's a number between 1 and 10"</font>
+ <b><u><font color="#000000">else</font></u></b>
+ <font color="#808080">"Something else"</font>
+ <b><u><font color="#000000">end</font></u></b>
+<b><u><font color="#000000">end</font></u></b>
+
+p check(<font color="#000000">5</font>) <i><font color="silver"># =&gt; "It's a number between 1 and 10"</font></i>
+</pre>
+<br />
+<h3 style='display: inline' id='blocks-and-yield'>Blocks and <span class='inlinecode'>yield</span></h3><br />
+<br />
+<span>Blocks are a cornerstone of Ruby. You can pass them to methods to customize their behavior. The <span class='inlinecode'>yield</span> keyword is used to call the block.</span><br />
+<br />
+<!-- Generator: GNU source-highlight 3.1.9
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><b><u><font color="#000000">def</font></u></b> my_iterator
+ puts <font color="#808080">"Entering the method"</font>
+ <b><u><font color="#000000">yield</font></u></b>
+ puts <font color="#808080">"Back in the method"</font>
+ <b><u><font color="#000000">yield</font></u></b>
+<b><u><font color="#000000">end</font></u></b>
+
+my_iterator { puts <font color="#808080">"Inside the block"</font> }
+<i><font color="silver"># Entering the method</font></i>
+<i><font color="silver"># Inside the block</font></i>
+<i><font color="silver"># Back in the method</font></i>
+<i><font color="silver"># Inside the block</font></i>
+</pre>
+<br />
+<span>This simple iterator shows how <span class='inlinecode'>yield</span> transfers control to the block. You can also pass arguments to <span class='inlinecode'>yield</span> and get a return value from the block.</span><br />
+<br />
+<!-- Generator: GNU source-highlight 3.1.9
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><b><u><font color="#000000">def</font></u></b> with_return
+ result = <b><u><font color="#000000">yield</font></u></b>(<font color="#000000">5</font>)
+ puts <font color="#808080">"The block returned #{result}"</font>
+<b><u><font color="#000000">end</font></u></b>
+
+with_return { |n| n * <font color="#000000">2</font> }
+<i><font color="silver"># =&gt; The block returned 10</font></i>
+</pre>
+<br />
+<span>This demonstrates passing an argument to the block and using its return value.</span><br />
+<br />
+<h2 style='display: inline' id='fun-with-data-types'>Fun with Data Types</h2><br />
+<br />
+<span>Ruby&#39;s core data types are full of nice little features.</span><br />
+<br />
+<h3 style='display: inline' id='symbols'>Symbols</h3><br />
+<br />
+<span>Symbols are like immutable strings. They are great for keys in hashes because they are unique and memory-efficient.</span><br />
+<br />
+<!-- Generator: GNU source-highlight 3.1.9
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><i><font color="silver"># Two strings with the same content are different objects</font></i>
+p <font color="#808080">"foo"</font>.object_id
+p <font color="#808080">"foo"</font>.object_id
+
+<i><font color="silver"># Two symbols with the same content are the same object</font></i>
+p :foo.object_id
+p :foo.object_id
+
+<i><font color="silver"># Modern hash syntax uses symbols as keys</font></i>
+my_hash = { name: <font color="#808080">"Paul"</font>, language: <font color="#808080">"Ruby"</font> }
+p my_hash[:name] <i><font color="silver"># =&gt; "Paul"</font></i>
+</pre>
+<br />
+<span>This code highlights the difference between strings and symbols and shows the convenient hash syntax.</span><br />
+<br />
+<h3 style='display: inline' id='arrays-and-hashes'>Arrays and Hashes</h3><br />
+<br />
+<span>Arrays and hashes have a rich API. The <span class='inlinecode'>%w</span> and <span class='inlinecode'>%i</span> shortcuts for creating arrays of strings and symbols are very handy.</span><br />
+<br />
+<!-- Generator: GNU source-highlight 3.1.9
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre><i><font color="silver"># Array of strings</font></i>
+p %w[one two three]
+<i><font color="silver"># =&gt; ["one", "two", "three"]</font></i>
+
+<i><font color="silver"># Array of symbols</font></i>
+p %i[one two three]
+<i><font color="silver"># =&gt; [:one, :two, :three]</font></i>
+</pre>
+<br />
+<span>A quick way to create arrays. You can also retrieve multiple values at once.</span><br />
+<br />
+<!-- Generator: GNU source-highlight 3.1.9
+by Lorenzo Bettini
+http://www.lorenzobettini.it
+http://www.gnu.org/software/src-highlite -->
+<pre>arr = [<font color="#000000">10</font>, <font color="#000000">20</font>, <font color="#000000">30</font>, <font color="#000000">40</font>, <font color="#000000">50</font>]
+p arr.values_at(<font color="#000000">0</font>, <font color="#000000">2</font>, <font color="#000000">4</font>)
+<i><font color="silver"># =&gt; [10, 30, 50]</font></i>
+
+hash = { a: <font color="#000000">1</font>, b: <font color="#000000">2</font>, c: <font color="#000000">3</font> }
+p hash.values_at(:a, :c)
+<i><font color="silver"># =&gt; [1, 3]</font></i>
+</pre>
+<br />
+<span>The <span class='inlinecode'>values_at</span> method is a concise way to get multiple elements.</span><br />
+<br />
+<h2 style='display: inline' id='final-thoughts'>Final Thoughts</h2><br />
+<br />
+<span>These are just a few of the many things I learned from "The Well-Grounded Rubyist". The book gave me a much deeper appreciation for the language and its design. If you are a Ruby programmer, I highly recommend it. Meanwhile, I also read the book "Programming Ruby 3.3", just I didn&#39;t have time to process my notes there yet. </span><br />
+<br />
+<span>E-Mail your comments to <span class='inlinecode'>paul@nospam.buetow.org</span> :-)</span><br />
+<br />
+<span>Other Ruby-related posts:</span><br />
+<br />
+<a class='textlink' href='./2021-07-04-the-well-grounded-rubyist.html'>2021-07-04 The Well-Grounded Rubyist</a><br />
+<br />
+<a class='textlink' href='../'>Back to the main site</a><br />
+<p class="footer">
+ Generated with <a href="https://codeberg.org/snonux/gemtexter">Gemtexter 3.0.1-develop</a> |
+ served by <a href="https://www.OpenBSD.org">OpenBSD</a>/<a href="https://man.openbsd.org/relayd.8">relayd(8)</a>+<a href="https://man.openbsd.org/httpd.8">httpd(8)</a> |
+ <a href="https://foo.zone/site-mirrors.html">Site Mirrors</a>
+ <br />
+ Webring: <a href="https://shring.sh/foo.zone/previous">previous</a> | <a href="https://shring.sh">shring</a> | <a href="https://shring.sh/foo.zone/next">next</a>
+</p>
+</body>
+</html>