<?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>Forem: Craig Bradley</title>
    <description>The latest articles on Forem by Craig Bradley (@craigbrad).</description>
    <link>https://forem.com/craigbrad</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%2F98133%2F4cf2ba3b-c6d7-417b-b7cb-8d115c494424.jpeg</url>
      <title>Forem: Craig Bradley</title>
      <link>https://forem.com/craigbrad</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/craigbrad"/>
    <language>en</language>
    <item>
      <title>Everything is an Object!</title>
      <dc:creator>Craig Bradley</dc:creator>
      <pubDate>Sun, 28 Oct 2018 14:16:12 +0000</pubDate>
      <link>https://forem.com/craigbrad/everything-is-an-object-5184</link>
      <guid>https://forem.com/craigbrad/everything-is-an-object-5184</guid>
      <description>&lt;p&gt;&lt;strong&gt;Everything is an object&lt;/strong&gt;. You may have heard this phrase before, but what does it mean?&lt;/p&gt;

&lt;h3&gt;
  
  
  What is an object?
&lt;/h3&gt;

&lt;p&gt;An object &lt;em&gt;refers to a particular instance of a class with their own methods or procedures and data variables&lt;/em&gt; meaning that &lt;strong&gt;everything is an instance of a class&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Types are objects
&lt;/h3&gt;

&lt;p&gt;In statically typed languages we can define variables of different types and those variables are not objects, they don't have methods and don't have any attributes. We could say that dynamically types languages define types as classes, so for example if you have a string, it's an instance of the &lt;code&gt;String&lt;/code&gt; class. &lt;/p&gt;

&lt;p&gt;Let's take a look at some examples in ruby:&lt;/p&gt;

&lt;h4&gt;
  
  
  True/False/Nil
&lt;/h4&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Define a boolean and store as a variable my_bool&lt;/span&gt;
&lt;span class="n"&gt;my_bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; true &lt;/span&gt;

&lt;span class="c1"&gt;# Can call the class method to return the class of the object&lt;/span&gt;
&lt;span class="n"&gt;my_bool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; TrueClass&lt;/span&gt;

&lt;span class="c1"&gt;# The superclass of TrueClass is Object&lt;/span&gt;
&lt;span class="no"&gt;TrueClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;superclass&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; Object&lt;/span&gt;

&lt;span class="c1"&gt;# my_bool is an object&lt;/span&gt;
&lt;span class="n"&gt;my_bool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_a?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; true&lt;/span&gt;

&lt;span class="n"&gt;my_bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; false&lt;/span&gt;
&lt;span class="n"&gt;my_bool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; FalseClass&lt;/span&gt;
&lt;span class="no"&gt;FalseClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;superclass&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; Object&lt;/span&gt;
&lt;span class="n"&gt;my_bool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_a?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; true&lt;/span&gt;

&lt;span class="n"&gt;my_nil&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; nil&lt;/span&gt;
&lt;span class="n"&gt;my_nil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; NilClass&lt;/span&gt;
&lt;span class="no"&gt;NilClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;superclass&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; Object&lt;/span&gt;
&lt;span class="n"&gt;my_nil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_a?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h4&gt;
  
  
  Strings
&lt;/h4&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;my_string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Some string"&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "Some string"&lt;/span&gt;
&lt;span class="n"&gt;my_string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; String&lt;/span&gt;
&lt;span class="no"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;superclass&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; Object&lt;/span&gt;
&lt;span class="n"&gt;my_string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_a?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;)&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;Okay, great, strings, booleans and nil are objects but what about other datatypes?&lt;/p&gt;

&lt;h4&gt;
  
  
  More Datatypes
&lt;/h4&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Define an array of values with different types&lt;/span&gt;
&lt;span class="n"&gt;my_array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"two"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:three&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"four"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;

&lt;span class="c1"&gt;# List of each objects type class&lt;/span&gt;
&lt;span class="n"&gt;classes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;my_array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ss"&gt;:class&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; [Integer, String, Symbol, Hash, Array]&lt;/span&gt;

&lt;span class="c1"&gt;# Every type class eventually inherits from object&lt;/span&gt;
&lt;span class="n"&gt;classes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ss"&gt;:superclass&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; [Numeric, Object, Object, Object, Object]&lt;/span&gt;

&lt;span class="c1"&gt;# An Integer has a superclass of Numeric, Numeric has a superclass of Object&lt;/span&gt;
&lt;span class="no"&gt;Numeric&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;superclass&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; Object&lt;/span&gt;

&lt;span class="c1"&gt;# All values in my_array are objects&lt;/span&gt;
&lt;span class="n"&gt;my_array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_a?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; [true, true, true, true, true]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;So every variable that you create is an object and this probably doesn't come as a surprise. However, what about classes? Are they objects? Yes (at least in ruby).&lt;/p&gt;

&lt;h3&gt;
  
  
  Classes are objects
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Classes in Ruby are first-class objects — each is an instance of class Class.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So let's take a look at what this means -&lt;br&gt;
When we create a class in ruby we usually use the following syntax:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Define new class Foo&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Foo&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# Foo is an object&lt;/span&gt;
&lt;span class="no"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_a?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;)&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;but what is really happening under the hood? It might make more sense if we define a class using different syntax:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Define new class Foo&lt;/span&gt;
&lt;span class="no"&gt;Foo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;
&lt;span class="no"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_a?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;)&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;This does exactly the same as the traditional method above does, but I think this makes it more clear as to what is happening. Whenever you create a new class, you're really creating a new instance of &lt;code&gt;Class&lt;/code&gt;. You're creating objects. This object is then assigned to a constant as you only want one instance of it. You can see all constants by calling the &lt;code&gt;constants&lt;/code&gt; method on &lt;code&gt;Module&lt;/code&gt;. See below a cut down list of constants.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;constants&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; [:String, :Float, :NilClass, :Hash, :Array,&lt;/span&gt;
&lt;span class="c1"&gt;# :Integer, :TrueClass, :FalseClass, :Numeric, :Fixnum, :Range, &lt;/span&gt;
&lt;span class="c1"&gt;# :Foo, :BasicObject, :Object, :Module, :Class, :Symbol]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can see that our Foo class that was created earlier has been added to this list of constants. Every constant in this list is an object.&lt;/p&gt;

&lt;h3&gt;
  
  
  Object Id's
&lt;/h3&gt;

&lt;p&gt;Every object in ruby has a unique id and this can be accessed by calling &lt;code&gt;object_id&lt;/code&gt;. Using this method we can see which objects have the same id's and there are also some interesting results. Constants will maintain the same id until execution is halted. There are no guarantees that constants will maintain the same id when the program is executed again. There are exceptions to this rule however, which I will discuss now.&lt;/p&gt;

&lt;h4&gt;
  
  
  True/False/Nil
&lt;/h4&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;true1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;true2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;true1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_id&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 20&lt;/span&gt;
&lt;span class="n"&gt;true2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_id&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 20&lt;/span&gt;

&lt;span class="n"&gt;false1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;
&lt;span class="n"&gt;false2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;
&lt;span class="n"&gt;false1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_id&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 0&lt;/span&gt;
&lt;span class="n"&gt;false2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_id&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 0&lt;/span&gt;

&lt;span class="n"&gt;nil1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;
&lt;span class="n"&gt;nil1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;
&lt;span class="n"&gt;nil1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_id&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 8&lt;/span&gt;
&lt;span class="n"&gt;nil2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_id&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;code&gt;true&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt; and &lt;code&gt;nil&lt;/code&gt; are special cases and these will maintain the same &lt;code&gt;object_id&lt;/code&gt; every time the program is executed. There is only ever one instance of each of these values.&lt;/p&gt;

&lt;h4&gt;
  
  
  Integers
&lt;/h4&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;int_a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;int_b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;int_a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_id&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 3&lt;/span&gt;
&lt;span class="n"&gt;int_b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_id&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 3&lt;/span&gt;

&lt;span class="n"&gt;int_a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;int_b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;int_a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_id&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 5&lt;/span&gt;
&lt;span class="n"&gt;int_b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_id&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 5&lt;/span&gt;

&lt;span class="n"&gt;int_a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;int_b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;int_a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_id&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 7&lt;/span&gt;
&lt;span class="n"&gt;int_b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_id&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 7&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Every integer in ruby has it's own unique id and this will never change. Whenever you refer to a variable of &lt;code&gt;234&lt;/code&gt;, you're referring to exactly the same object. You might have noticed a pattern in the &lt;code&gt;object_id&lt;/code&gt;'s for integers. If you bit shift the integer to the left by one and add one, you will get the objects id. Vice versa if you bit shift the objects id to the right, you will get the integer. I believe this is for performance reasons.&lt;/p&gt;

&lt;h4&gt;
  
  
  Symbols
&lt;/h4&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;my_sym1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;:foo&lt;/span&gt;
&lt;span class="n"&gt;my_sym2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="ss"&gt;:foo&lt;/span&gt;
&lt;span class="n"&gt;my_sym1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_id&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 1280988&lt;/span&gt;
&lt;span class="n"&gt;my_sym2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_id&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 1280988&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Symbols are immutable. The first time you create the symbol &lt;code&gt;:foo&lt;/code&gt; it will create a new object and store it in a list which you can access via &lt;code&gt;Symbol.all_symbols&lt;/code&gt;. The second time, we already have a &lt;code&gt;:foo&lt;/code&gt; symbol in the list and therefore it will reference this one. Symbols are created once and referenced multiple times, they cannot be changed.&lt;/p&gt;

&lt;h4&gt;
  
  
  Strings
&lt;/h4&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;my_string1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"foo"&lt;/span&gt;
&lt;span class="n"&gt;my_string2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"foo"&lt;/span&gt;
&lt;span class="n"&gt;my_string1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_id&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 70093438879580&lt;/span&gt;
&lt;span class="n"&gt;my_string2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_id&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 70093438872080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Strings are mutable and therefore whenever you create two strings that are equal, you'll get different objects. Although we've created two variables, both with the same value &lt;code&gt;"foo"&lt;/code&gt; they are different objects.&lt;/p&gt;

&lt;h3&gt;
  
  
  So everything is an object?
&lt;/h3&gt;

&lt;p&gt;When we say everything is an object, the everything part is a bit vague. Methods, blocks and operators are not objects. The lines are a little blurry with methods and blocks as they can be interpreted as objects.&lt;/p&gt;

&lt;h4&gt;
  
  
  Methods
&lt;/h4&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Declare a new method foo&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;foo&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"test"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# Get a wrapped version of foo&lt;/span&gt;
&lt;span class="n"&gt;my_method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:foo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# my_method is an instance of Method&lt;/span&gt;
&lt;span class="n"&gt;my_method&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; Method&lt;/span&gt;

&lt;span class="c1"&gt;# Method has a superclass of Object&lt;/span&gt;
&lt;span class="no"&gt;Method&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;superclass&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; Object&lt;/span&gt;

&lt;span class="c1"&gt;# Can invoke the method using call&lt;/span&gt;
&lt;span class="n"&gt;my_method&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; "test"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;It's unclear whether methods are actually objects or not. They behave like objects but you can never access the method directly. You will always get a wrapped version of the method which acts like a closure. I would be tempted to say that methods are not objects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;To summarise, almost everything in ruby is an object. Every data type that we work with is a class and classes are objects. Even the &lt;code&gt;Object&lt;/code&gt; class is an object. Strings, integers, floats, hashes, arrays, symbols, classes, modules, errors and more are all objects. Open up an &lt;code&gt;irb&lt;/code&gt; console and see for yourself, there are some really interesting observations to make. &lt;/p&gt;

</description>
      <category>ruby</category>
      <category>programming</category>
      <category>learning</category>
      <category>beginners</category>
    </item>
    <item>
      <title>The Power of a Todo List Project</title>
      <dc:creator>Craig Bradley</dc:creator>
      <pubDate>Sun, 21 Oct 2018 17:59:10 +0000</pubDate>
      <link>https://forem.com/craigbrad/the-power-of-a-todo-list-project-30fa</link>
      <guid>https://forem.com/craigbrad/the-power-of-a-todo-list-project-30fa</guid>
      <description>&lt;p&gt;I'm aware that there are several posts about how a Todo list can be demotivating, however I think they still have their place. There are several reasons developers choose to develop a Todo list, especially when learning a new language or learning to code. The main reason is that it's simple yet complex enough to explore most features of a language, which is great for beginners and experienced developers.&lt;/p&gt;

&lt;p&gt;For a beginner it can be a daunting experience trying to choose the perfect project. A Todo list can be broken down easily and implemented as several separate components, which makes a perfect first project. It allows for faster results and reduces the feedback loop. There is nothing more motivating than seeing results quickly, especially for a beginner.&lt;/p&gt;

&lt;p&gt;For more experienced developers trying their hand at a new language, it is complex enough that it will really allow you to explore the full range of features a language offers. The list itself will get you thinking about data structures and it's items about data types and object orientation. Creativity is the only boundary and this is still true for a Todo list. &lt;/p&gt;

&lt;p&gt;So what components can we break a Todo list down in to. The most obvious starting point is the list itself and this should get us thinking about what data structure to use. I'd tend to go with the simplest of structures first which would be an array. Then if we think about data types, an item could initially be a string. Without a list, we can't implement the other components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding an item&lt;/li&gt;
&lt;li&gt;Removing an item&lt;/li&gt;
&lt;li&gt;Displaying items&lt;/li&gt;
&lt;li&gt;Ordering items&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Future changes such as setting "done by" dates might force us to change the data type of an item. I'll avoid going into more detail about software design at this point, but for more experienced developers this could be another consideration.&lt;/p&gt;

&lt;p&gt;There are examples of Todo lists in every single language and this is great help especially for beginners. Being able to implement something and then look at how others have done so is a great way to learn.&lt;/p&gt;

&lt;p&gt;So to wrap up, I still think there are major benefits from a traditional Todo list project. It might not be the most exciting of projects but it really does allow you to explore a language and for me this is the most exciting thing. &lt;/p&gt;

&lt;p&gt;If you feel I've missed any important points or you disagree then feel free to leave a comment with what is missing or what you disagree with.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>programming</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
