In the previous articles, we have learned about String and Array in Ruby. In this post, we’ll take a look at some of Ruby’s other important objects: math, dates, regular expressions, and hashes.
Math
Like most programming languages, Ruby supports a large number of math operations:
1 2 3 4 5 6 7 8 9 | <span class="token operator">></span> <span class="token operator">></span> <span class="token number">1</span> <span class="token operator">+</span> <span class="token number">1</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">2</span> <span class="token operator">></span> <span class="token operator">></span> <span class="token number">2</span> <span class="token operator">-</span> <span class="token number">3</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token operator">-</span> <span class="token number">1</span> <span class="token operator">></span> <span class="token operator">></span> <span class="token number">2</span> <span class="token operator">*</span> <span class="token number">3</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">6</span> <span class="token operator">></span> <span class="token operator">></span> <span class="token number">10</span> <span class="token operator">/</span> <span class="token number">5</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">2</span> |
Pay great attention to division, as it is confusing:
1 2 3 4 5 | <span class="token operator">></span> <span class="token operator">></span> <span class="token number">10</span> <span class="token operator">/</span> <span class="token number">4</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">2</span> <span class="token operator">></span> <span class="token operator">></span> <span class="token number">2</span> <span class="token operator">/</span> <span class="token number">3</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">0</span> |
Here, Ruby uses integer division. If you want to perform decimal division, add .0 to the numerator or denominator.
1 2 3 4 5 | <span class="token operator">></span> <span class="token operator">></span> <span class="token number">10</span> <span class="token operator">/</span> <span class="token number">4.0</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">2.5</span> <span class="token operator">></span> <span class="token operator">></span> <span class="token number">2</span> <span class="token operator">/</span> <span class="token number">3.0</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">0.6666666666666666</span> |
There are a lot of developers, including myself, who prefer to use irb as a simple calculator when computationally needed. The interface doesn’t seem very nice, but it’s pretty fast and powerful, with the ability to define variables.
More advanced operations
Ruby also supports a variety of advanced math operations through a module called Math , with useful functions such as constants, roots, and trigonometric functions.
1 2 3 4 5 6 7 | <span class="token operator">></span> <span class="token operator">></span> <span class="token constant">Math</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">PI</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">3.141592653589793</span> <span class="token operator">></span> <span class="token operator">></span> <span class="token constant">Math</span> <span class="token punctuation">.</span> sqrt <span class="token punctuation">(</span> <span class="token number">2</span> <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1.4142135623730951</span> <span class="token operator">></span> <span class="token operator">></span> <span class="token constant">Math</span> <span class="token punctuation">.</span> cos <span class="token punctuation">(</span> <span class="token number">2</span> <span class="token operator">*</span> <span class="token constant">Math</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">PI</span> <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> |
The 2-dot symbol and uppercase letters ( Math :: PI ) above are characteristic of module constants . In addition, Ruby also supports a number of other trigonometric and power functions such as:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <span class="token operator">></span> <span class="token operator">></span> <span class="token constant">Math</span> <span class="token punctuation">.</span> log <span class="token punctuation">(</span> <span class="token constant">Math</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">E</span> <span class="token punctuation">)</span> <span class="token number">1</span> <span class="token operator">></span> <span class="token operator">></span> <span class="token constant">Math</span> <span class="token punctuation">.</span> log <span class="token punctuation">(</span> <span class="token number">10</span> <span class="token punctuation">)</span> <span class="token number">2.302585092994046</span> <span class="token operator">></span> <span class="token operator">></span> <span class="token constant">Math</span> <span class="token punctuation">.</span> log10 <span class="token punctuation">(</span> <span class="token number">10</span> <span class="token punctuation">)</span> <span class="token number">1</span> <span class="token operator">></span> <span class="token operator">></span> <span class="token constant">Math</span> <span class="token punctuation">.</span> log10 <span class="token punctuation">(</span> <span class="token number">1000000</span> <span class="token punctuation">)</span> <span class="token number">6</span> <span class="token operator">></span> <span class="token operator">></span> <span class="token constant">Math</span> <span class="token punctuation">.</span> log10 <span class="token punctuation">(</span> <span class="token constant">Math</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">E</span> <span class="token punctuation">)</span> <span class="token number">0.4342944819032518</span> <span class="token operator">></span> <span class="token operator">></span> <span class="token number">2</span> <span class="token operator">*</span> <span class="token operator">*</span> <span class="token number">3</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">8</span> <span class="token operator">></span> <span class="token operator">></span> <span class="token constant">Math</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">E</span> <span class="token operator">*</span> <span class="token operator">*</span> <span class="token number">100</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">2.6881171418161212e+43</span> |
You can find out more details about the Math module here .
Math to string
In previous articles, we have learned how to convert strings to arrays (and vice versa) by using split and join . Similarly, Ruby also allows us to convert numbers and strings.
Probably the most common way to convert numbers to strings is by using the to_s (“to string”) method.
1 2 3 4 | <span class="token operator">></span> <span class="token operator">></span> tau <span class="token operator">=</span> <span class="token number">2</span> <span class="token operator">*</span> <span class="token constant">Math</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">PI</span> <span class="token operator">></span> <span class="token operator">></span> tau <span class="token punctuation">.</span> to_s <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">"6.283185307179586"</span> |
There are also other methods like to_i (“to integer”) and to_f (“to float”).
1 2 3 4 5 | <span class="token operator">></span> <span class="token operator">></span> <span class="token string">"6.283185307179586"</span> <span class="token punctuation">.</span> to_f <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">6.283185307179586</span> <span class="token operator">></span> <span class="token operator">></span> <span class="token string">"6"</span> <span class="token punctuation">.</span> to_i <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">6</span> |
Time
Another frequently used object is Time (Technically it’s a class). Through Time learning, we get our first chance to learn about a new method, also known as a constructor function which is a basic Ruby way of creating new objects.
Until now, we used to use quotes or parentheses to directly initialize a new object, now we can use the new method to define a new object like a string or array …
1 2 3 4 5 | <span class="token operator">></span> <span class="token operator">></span> s <span class="token operator">=</span> <span class="token builtin">String</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token punctuation">(</span> <span class="token string">"A man, a plan, a canal—Panama!"</span> <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">"A man, a plan, a canal—Panama!"</span> <span class="token operator">></span> <span class="token operator">></span> s <span class="token punctuation">.</span> split <span class="token punctuation">(</span> <span class="token string">", "</span> <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">[</span> <span class="token string">"A man"</span> <span class="token punctuation">,</span> <span class="token string">"a plan"</span> <span class="token punctuation">,</span> <span class="token string">"a canal—Panama!"</span> <span class="token punctuation">]</span> |
and
1 2 3 4 5 6 | <span class="token operator">></span> <span class="token operator">></span> a <span class="token operator">=</span> <span class="token builtin">Array</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token operator">></span> <span class="token operator">></span> a <span class="token operator"><</span> <span class="token operator"><</span> <span class="token number">3</span> <span class="token operator"><</span> <span class="token operator"><</span> <span class="token number">4</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">[</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">]</span> <span class="token operator">></span> <span class="token operator">></span> a <span class="token operator"><</span> <span class="token operator"><</span> <span class="token string">"hello, world!"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">[</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">,</span> <span class="token string">'hello, world!'</span> <span class="token punctuation">]</span> |
Unlike strings or arrays, we cannot initialize Time with brackets or quotes, but we must use the new method.
1 2 3 | <span class="token operator">></span> <span class="token operator">></span> now <span class="token operator">=</span> <span class="token builtin">Time</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">2018</span> <span class="token operator">-</span> <span class="token number">08</span> <span class="token operator">-</span> <span class="token number">14</span> <span class="token number">19</span> <span class="token punctuation">:</span> <span class="token number">18</span> <span class="token punctuation">:</span> <span class="token number">36</span> <span class="token operator">-</span> <span class="token number">0700</span> |
When called without passing any arguments, Time.new will return the current time. In addition, we can also use Time.now to get the current time.
1 2 3 | <span class="token operator">></span> <span class="token operator">></span> now <span class="token operator">=</span> <span class="token builtin">Time</span> <span class="token punctuation">.</span> now <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">2018</span> <span class="token operator">-</span> <span class="token number">08</span> <span class="token operator">-</span> <span class="token number">14</span> <span class="token number">19</span> <span class="token punctuation">:</span> <span class="token number">18</span> <span class="token punctuation">:</span> <span class="token number">55</span> <span class="token operator">-</span> <span class="token number">0700</span> |
Similar to other Ruby objects, Time objects also support many different methods.
1 2 3 4 5 6 7 8 9 | <span class="token operator">></span> <span class="token operator">></span> now <span class="token punctuation">.</span> year <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">2018</span> <span class="token operator">></span> <span class="token operator">></span> now <span class="token punctuation">.</span> day <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">14</span> <span class="token operator">></span> <span class="token operator">></span> now <span class="token punctuation">.</span> month <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">8</span> <span class="token operator">></span> <span class="token operator">></span> now <span class="token punctuation">.</span> hour <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">19</span> |
It is also possible to instantiate a Time object by passing specific date and time values.
1 2 3 4 5 | <span class="token operator">></span> <span class="token operator">></span> moon_landing <span class="token operator">=</span> <span class="token builtin">Time</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token punctuation">(</span> <span class="token number">1969</span> <span class="token punctuation">,</span> <span class="token number">7</span> <span class="token punctuation">,</span> <span class="token number">20</span> <span class="token punctuation">,</span> <span class="token number">20</span> <span class="token punctuation">,</span> <span class="token number">17</span> <span class="token punctuation">,</span> <span class="token number">40</span> <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1969</span> <span class="token operator">-</span> <span class="token number">07</span> <span class="token operator">-</span> <span class="token number">20</span> <span class="token number">20</span> <span class="token punctuation">:</span> <span class="token number">17</span> <span class="token punctuation">:</span> <span class="token number">40</span> <span class="token operator">-</span> <span class="token number">0700</span> <span class="token operator">></span> <span class="token operator">></span> moon_landing <span class="token punctuation">.</span> day <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">20</span> |
By default, Time will use the local time zone, however it will cause difference between locations so we will use UTC time.
1 2 3 | <span class="token operator">></span> <span class="token operator">></span> moon_landing <span class="token operator">=</span> <span class="token builtin">Time</span> <span class="token punctuation">.</span> utc <span class="token punctuation">(</span> <span class="token number">1969</span> <span class="token punctuation">,</span> <span class="token number">7</span> <span class="token punctuation">,</span> <span class="token number">20</span> <span class="token punctuation">,</span> <span class="token number">20</span> <span class="token punctuation">,</span> <span class="token number">17</span> <span class="token punctuation">,</span> <span class="token number">40</span> <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1969</span> <span class="token operator">-</span> <span class="token number">07</span> <span class="token operator">-</span> <span class="token number">20</span> <span class="token number">20</span> <span class="token punctuation">:</span> <span class="token number">17</span> <span class="token punctuation">:</span> <span class="token number">40</span> <span class="token constant">UTC</span> |
Finally, with Time, we can also perform math operations with them, such as addition, subtraction …
1 2 3 | <span class="token operator">></span> <span class="token operator">></span> now <span class="token operator">-</span> moon_landing <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1548482571.0</span> |
We can get the name of the current thing by creating an array containing the dates of the week. Then, use wday (weekday) as the array’s index.
1 2 3 4 | irb <span class="token punctuation">(</span> main <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token number">016</span> <span class="token punctuation">:</span> <span class="token number">0</span> <span class="token operator">></span> <span class="token constant">DAYNAMES</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string">"Sunday"</span> <span class="token punctuation">,</span> <span class="token string">"Monday"</span> <span class="token punctuation">,</span> <span class="token string">"Tuesday"</span> <span class="token punctuation">,</span> <span class="token string">"Wednesday"</span> <span class="token punctuation">,</span> <span class="token string">"Thursday"</span> <span class="token punctuation">,</span> <span class="token string">"Friday"</span> <span class="token punctuation">,</span> <span class="token string">"Saturday"</span> <span class="token punctuation">]</span> irb <span class="token punctuation">(</span> main <span class="token punctuation">)</span> <span class="token punctuation">:</span> <span class="token number">019</span> <span class="token punctuation">:</span> <span class="token number">0</span> <span class="token operator">></span> <span class="token constant">DAYNAMES</span> <span class="token punctuation">[</span> <span class="token builtin">Time</span> <span class="token punctuation">.</span> now <span class="token punctuation">.</span> wday <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">"Tuesday"</span> |
Finally, we will update the hello app (using Sinatra) to display the date of the week.
1 2 3 4 5 6 7 8 9 | <span class="token keyword">require</span> <span class="token string">'sinatra'</span> get <span class="token string">'/'</span> <span class="token keyword">do</span> <span class="token constant">DAYNAMES</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string">"Sunday"</span> <span class="token punctuation">,</span> <span class="token string">"Monday"</span> <span class="token punctuation">,</span> <span class="token string">"Tuesday"</span> <span class="token punctuation">,</span> <span class="token string">"Wednesday"</span> <span class="token punctuation">,</span> <span class="token string">"Thursday"</span> <span class="token punctuation">,</span> <span class="token string">"Friday"</span> <span class="token punctuation">,</span> <span class="token string">"Saturday"</span> <span class="token punctuation">]</span> dayname <span class="token operator">=</span> <span class="token constant">DAYNAMES</span> <span class="token punctuation">[</span> <span class="token builtin">Time</span> <span class="token punctuation">.</span> now <span class="token punctuation">.</span> wday <span class="token punctuation">]</span> <span class="token string">"Hello, world! Happy <span class="token interpolation"><span class="token delimiter tag">#{</span> dayname <span class="token delimiter tag">}</span></span> ."</span> <span class="token keyword">end</span> |
Regular expressions
Ruby has full support for regular expressions , commonly referred to simply as regexes or regexps , which is a small and powerful language for matching patterns in text.
Mastering purely regular expressions is beyond the scope of this article, and probably very few master it. But the good news is, there’s a ton of regular expressions documented so we can dig into it.
It is important that you have a general idea of regular expressions and be able to dig deeper when you need to use it.
Regexes has a reputation for being very brief and error prone, as famous programmer Jamie Zawinski said :
For some people, when they face a problem, they think “Ok, I’ll use regular expressions to solve it”. And so they run into 2 problems!
Fortunately, this situation has been greatly improved by useful web applications such as Rubular that allow us to visually construct regexes.
Rubular is a dedicated web regexes for Ruby. And let’s also learn some basic knowledge about regex in Ruby.
A regex is basically checking if a string matches a particular pattern. We can create a new regex using the new function. However, we often use the /…/ notation more often. The example below is a regex match with the US ZIP Code , consisting of 5 consecutive digits. zip_code = /d{5}/
If you use regular expressions you will remember the syntax, but you can also look up references like Rubular .
And now we will see how to know if a string matches the regex. And we will use the match method to test.
1 2 3 4 5 | <span class="token operator">></span> <span class="token operator">></span> <span class="token string">"no match"</span> <span class="token punctuation">.</span> match <span class="token punctuation">(</span> zip_code <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token keyword">nil</span> <span class="token operator">></span> <span class="token operator">></span> <span class="token string">"Beverly Hills 90210"</span> <span class="token punctuation">.</span> match <span class="token punctuation">(</span> zip_code <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token comment">#<MatchData "90210"></span> |
In practice, it’s more common to use it in a boolean context, like this:
1 2 3 4 | <span class="token operator">></span> <span class="token operator">></span> s <span class="token operator">=</span> <span class="token string">"Beverly Hills 90210"</span> <span class="token operator">></span> <span class="token operator">></span> puts <span class="token string">"It's got a ZIP code!"</span> <span class="token keyword">if</span> s <span class="token punctuation">.</span> match <span class="token punctuation">(</span> zip_code <span class="token punctuation">)</span> <span class="token string">"It's got a ZIP code!"</span> |
Another common operation is the creation of an array of all matches. First we create a longer string and contain 2 zip codes.
1 2 3 4 5 | <span class="token operator">></span> <span class="token operator">></span> s <span class="token operator">=</span> <span class="token string">"Beverly Hills 90210 was a '90s TV show set in Los Angeles."</span> <span class="token operator">></span> <span class="token operator">></span> s <span class="token operator">+</span> <span class="token operator">=</span> <span class="token string">" 91125 is another ZIP code in the Los Angeles area."</span> <span class="token operator">=</span> <span class="token operator">></span> " <span class="token constant">Beverly</span> <span class="token constant">Hills</span> <span class="token number">90210</span> was a ' <span class="token number">90</span> s <span class="token constant">TV</span> show set <span class="token keyword">in</span> <span class="token constant">Los</span> <span class="token constant">Angeles</span> <span class="token punctuation">.</span> <span class="token number">91125</span> is another <span class="token constant">ZIP</span> code <span class="token keyword">in</span> the <span class="token constant">Los</span> <span class="token constant">Angeles</span> area <span class="token punctuation">.</span> " |
To check if a string matches the regex, we use the String # scan method to find an array of matches.
1 2 3 | <span class="token operator">></span> <span class="token operator">></span> s <span class="token punctuation">.</span> scan <span class="token punctuation">(</span> zip_code <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">[</span> <span class="token string">"90210"</span> <span class="token punctuation">,</span> <span class="token string">"91125"</span> <span class="token punctuation">]</span> |
We can also scan to find all words are capital letters.
1 2 3 | <span class="token operator">></span> <span class="token operator">></span> s <span class="token punctuation">.</span> scan <span class="token punctuation">(</span> <span class="token regex">/[A-Z]{2,}/</span> <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">[</span> <span class="token string">"TV"</span> <span class="token punctuation">,</span> <span class="token string">"ZIP"</span> <span class="token punctuation">]</span> |
Alternatively, you can refer to Rubular .
Splitting on regexes
In the previous section, we learned how to split a string based on space like this:
1 2 3 | <span class="token operator">></span> <span class="token operator">></span> <span class="token string">"ant bat cat duck"</span> <span class="token punctuation">.</span> split <span class="token punctuation">(</span> <span class="token string">" "</span> <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">[</span> <span class="token string">'ant'</span> <span class="token punctuation">,</span> <span class="token string">'bat'</span> <span class="token punctuation">,</span> <span class="token string">'cat'</span> <span class="token punctuation">,</span> <span class="token string">'duck'</span> <span class="token punctuation">]</span> |
In this section, by manipulating the regex we can use a more powerful method. In regex a space is s and represents “one or more” as the plus sign + . And we get the following results:
1 2 3 | <span class="token operator">></span> <span class="token operator">></span> <span class="token string">"ant bat cat duck"</span> <span class="token punctuation">.</span> split <span class="token punctuation">(</span> <span class="token regex">/s+/</span> <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">[</span> <span class="token string">"ant"</span> <span class="token punctuation">,</span> <span class="token string">"bat"</span> <span class="token punctuation">,</span> <span class="token string">"cat"</span> <span class="token punctuation">,</span> <span class="token string">"duck"</span> <span class="token punctuation">]</span> |
This way we will get the same result for strings with lots of spaces, many tabs, or many newlines …
1 2 3 | <span class="token operator">></span> <span class="token operator">></span> <span class="token string">"ant battcatnduck"</span> <span class="token punctuation">.</span> split <span class="token punctuation">(</span> <span class="token regex">/s+/</span> <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">[</span> <span class="token string">"ant"</span> <span class="token punctuation">,</span> <span class="token string">"bat"</span> <span class="token punctuation">,</span> <span class="token string">"cat"</span> <span class="token punctuation">,</span> <span class="token string">"duck"</span> <span class="token punctuation">]</span> |
In addition, when calling the split function without parameters, Ruby automatically separates based on whitespace:
1 2 3 | <span class="token operator">></span> <span class="token operator">></span> <span class="token string">"ant battcatnduck"</span> <span class="token punctuation">.</span> split <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">[</span> <span class="token string">"ant"</span> <span class="token punctuation">,</span> <span class="token string">"bat"</span> <span class="token punctuation">,</span> <span class="token string">"cat"</span> <span class="token punctuation">,</span> <span class="token string">"duck"</span> <span class="token punctuation">]</span> |
Hashes
The next data type we will find out is that hash , also known as associative array ( associative array ). You can think of a hash like an ordinary array, but it’s labeled for each value, not index. For example, instead of array [0] = 0 , the hash would be hash [“name”] = “Michael” . Therefore, each element in it is a value pair: including 1 label (key) and any value (valune). And we often call it key / value pairs.
And we usually set the value for label (key) to be of type string, for example we can create an object that stores the user’s first and last name as follows:
1 2 3 4 5 6 7 | <span class="token operator">></span> <span class="token operator">></span> user <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token comment"># {} is an empty hash.</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token operator">></span> user <span class="token punctuation">[</span> <span class="token string">"first_name"</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"Michael"</span> <span class="token comment"># Key "first_name", value "Michael"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">"Michael"</span> <span class="token operator">></span> <span class="token operator">></span> user <span class="token punctuation">[</span> <span class="token string">"last_name"</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"Hartl"</span> <span class="token comment"># Key "last_name", value "Hartl"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">"Hartl"</span> |
As you can see, we initialize an empty hash with {} braces. And assign the value to the element with square brackets [] (same as for array). And we can access the value of an element in the same way:
1 2 3 4 5 6 7 | <span class="token operator">></span> <span class="token operator">></span> user <span class="token punctuation">[</span> <span class="token string">"first_name"</span> <span class="token punctuation">]</span> <span class="token comment"># Element access is like arrays</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">"Michael"</span> <span class="token operator">></span> <span class="token operator">></span> user <span class="token punctuation">[</span> <span class="token string">"last_name"</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">"Hartl"</span> <span class="token operator">></span> <span class="token operator">></span> user <span class="token punctuation">[</span> <span class="token string">"nonexistent"</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token keyword">nil</span> |
Note, in the last example above, the hash will return nil when the key doesn’t exist.
Instead of defining an element one by one for the hash using square brackets, we can use hashrocket => to define a series of elements.
1 2 3 4 5 | <span class="token operator">></span> <span class="token operator">></span> user <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token string">"first_name"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">"Michael"</span> <span class="token punctuation">,</span> <span class="token string">"last_name"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">"Hartl"</span> <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token operator">></span> moonman <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token string">"first_name"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">"Buzz"</span> <span class="token punctuation">,</span> <span class="token string">"last_name"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">"Aldrin"</span> <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token string">"first_name"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">"Buzz"</span> <span class="token punctuation">,</span> <span class="token string">"last_name"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">"Aldrin"</span> <span class="token punctuation">}</span> |
Symbols
As we learned above, we used strings for hash keys, but now we use symbols more often. Symbols string looks similar, but it will come prefix a colon: and not be surrounded by quotes.
1 2 3 4 5 | <span class="token operator">></span> <span class="token operator">></span> <span class="token string">"name"</span> <span class="token punctuation">.</span> split <span class="token punctuation">(</span> <span class="token string">''</span> <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">[</span> <span class="token string">"n"</span> <span class="token punctuation">,</span> <span class="token string">"a"</span> <span class="token punctuation">,</span> <span class="token string">"m"</span> <span class="token punctuation">,</span> <span class="token string">"e"</span> <span class="token punctuation">]</span> <span class="token operator">></span> <span class="token operator">></span> <span class="token symbol">:name</span> <span class="token punctuation">.</span> split <span class="token punctuation">(</span> <span class="token string">''</span> <span class="token punctuation">)</span> <span class="token constant">NoMethodError</span> <span class="token punctuation">:</span> undefined method `split' <span class="token keyword">for</span> <span class="token symbol">:name</span> <span class="token symbol">:Symbol</span> |
Symbols are a special Ruby data type, and are very rare in other languages. Therefore, they may seem a bit weird at first, but Ruby uses them a lot, so you will quickly get used to it.
Unlike string, not all characters are valid for symbols, however, if you enclose it in quotation marks as a type of string then it will run:
1 2 3 4 5 6 7 8 9 | <span class="token operator">></span> <span class="token operator">></span> <span class="token symbol">:foo</span> <span class="token operator">-</span> bar <span class="token constant">NameError</span> <span class="token punctuation">:</span> undefined local variable <span class="token keyword">or</span> method `bar' <span class="token keyword">for</span> main <span class="token symbol">:Object</span> <span class="token operator">></span> <span class="token operator">></span> <span class="token punctuation">:</span> <span class="token number">2</span> foo <span class="token constant">SyntaxError</span> <span class="token operator">></span> <span class="token operator">></span> <span class="token punctuation">:</span> <span class="token string">"foo-bar"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">:</span> <span class="token string">"foo-bar"</span> <span class="token operator">></span> <span class="token operator">></span> <span class="token punctuation">:</span> <span class="token string">"2foo"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">:</span> <span class="token string">"2foo"</span> |
We can define a hash user using the following symbol:
1 2 3 4 5 6 7 | <span class="token operator">></span> <span class="token operator">></span> user <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token symbol">:name</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">"Michael Hartl"</span> <span class="token punctuation">,</span> <span class="token symbol">:email</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">" <a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a> "</span> <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token symbol">:name</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">"Michael Hartl"</span> <span class="token punctuation">,</span> <span class="token symbol">:email</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">" <a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a> "</span> <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token operator">></span> user <span class="token punctuation">[</span> <span class="token symbol">:name</span> <span class="token punctuation">]</span> <span class="token comment"># Access the value corresponding to :name.</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">"Michael Hartl"</span> <span class="token operator">></span> <span class="token operator">></span> user <span class="token punctuation">[</span> <span class="token symbol">:password</span> <span class="token punctuation">]</span> <span class="token comment"># Access the value of an undefined key.</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token keyword">nil</span> |
The use of symbols for hashes is very common, so Ruby also supports hash initialization:
1 2 3 | <span class="token operator">></span> <span class="token operator">></span> user <span class="token operator">=</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">"Michael Hartl"</span> <span class="token punctuation">,</span> email <span class="token punctuation">:</span> <span class="token string">" <a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a> "</span> <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token symbol">:name</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">"Michael Hartl"</span> <span class="token punctuation">,</span> <span class="token symbol">:email</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">" <a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a> "</span> <span class="token punctuation">}</span> |
In the second syntax, we replaced the symbol / hashrocket symbol, with the name of the key and followed by a colon.
1 2 | <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">"Michael Hartl"</span> <span class="token punctuation">,</span> email <span class="token punctuation">:</span> <span class="token string">" <a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a> "</span> <span class="token punctuation">}</span> |
This writing style is similar to other languages (such as Javascript), so this writing style is increasingly popular in the Ruby community. In short, the above two ways of writing are very popular, so we can write in any way.
However, you need to pay close attention to the different spelling between the two methods above to avoid confusion, that is: { :name => "Michael Hartl" }
(with 2 dots before, and with hashrocket =>) and { name: "Michael Hartl" }
(dot after)
Nested hashes
In fact, the hash may contain any value, even contain other hashes. And people call it nested hashes , it is frequently used in web development.
1 2 3 4 5 6 7 8 9 | <span class="token operator">></span> <span class="token operator">></span> params <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token comment"># Define a hash called 'params' (short for 'parameters').</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token operator">></span> params <span class="token punctuation">[</span> <span class="token symbol">:user</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">"Michael Hartl"</span> <span class="token punctuation">,</span> email <span class="token punctuation">:</span> <span class="token string">" <a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a> "</span> <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token symbol">:name</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">"Michael Hartl"</span> <span class="token punctuation">,</span> <span class="token symbol">:email</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">" <a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a> "</span> <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token operator">></span> params <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token symbol">:user</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token symbol">:name</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">"Michael Hartl"</span> <span class="token punctuation">,</span> <span class="token symbol">:email</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">" <a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a> "</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token operator">></span> params <span class="token punctuation">[</span> <span class="token symbol">:user</span> <span class="token punctuation">]</span> <span class="token punctuation">[</span> <span class="token symbol">:email</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">" <a class="__cf_email__" href="/cdn-cgi/l/email-protection">[email protected]</a> "</span> |
Hash iteration
Similar to arrays, hashes also support each method. For example, consider hash flash with the keys : success and : danger
1 2 3 4 5 6 7 8 | <span class="token operator">></span> <span class="token operator">></span> flash <span class="token operator">=</span> <span class="token punctuation">{</span> success <span class="token punctuation">:</span> <span class="token string">"It worked!"</span> <span class="token punctuation">,</span> danger <span class="token punctuation">:</span> <span class="token string">"It failed."</span> <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token symbol">:success</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">"It worked!"</span> <span class="token punctuation">,</span> <span class="token symbol">:danger</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">"It failed."</span> <span class="token punctuation">}</span> <span class="token operator">></span> <span class="token operator">></span> flash <span class="token punctuation">.</span> <span class="token keyword">each</span> <span class="token keyword">do</span> <span class="token operator">|</span> key <span class="token punctuation">,</span> value <span class="token operator">|</span> <span class="token operator">?</span> <span class="token operator">></span> puts <span class="token string">"Key <span class="token interpolation"><span class="token delimiter tag">#{</span> key <span class="token punctuation">.</span> inspect <span class="token delimiter tag">}</span></span> has value <span class="token interpolation"><span class="token delimiter tag">#{</span> value <span class="token punctuation">.</span> inspect <span class="token delimiter tag">}</span></span> "</span> <span class="token operator">></span> <span class="token operator">></span> <span class="token keyword">end</span> <span class="token constant">Key</span> <span class="token symbol">:success</span> has value <span class="token string">"It worked!"</span> <span class="token constant">Key</span> <span class="token symbol">:danger</span> has value <span class="token string">"It failed."</span> |
Note that, while each in the array has only one variable in the code block, each in the hash will have two variables, key and value . Thus, for each loop, each method will iterate over a key-value pair.
Next, we’ll learn the inspect method, which returns a string with the wildcard it calls:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token operator">></span> <span class="token operator">></span> puts <span class="token punctuation">(</span> <span class="token number">1.</span> <span class="token number">.5</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> to_a <span class="token comment"># Put an array as a string.</span> <span class="token number">1</span> <span class="token number">2</span> <span class="token number">3</span> <span class="token number">4</span> <span class="token number">5</span> <span class="token operator">></span> <span class="token operator">></span> puts <span class="token punctuation">(</span> <span class="token number">1.</span> <span class="token number">.5</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> to_a <span class="token punctuation">.</span> inspect <span class="token comment"># Put a literal array.</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">,</span> <span class="token number">5</span> <span class="token punctuation">]</span> <span class="token operator">></span> <span class="token operator">></span> puts <span class="token symbol">:name</span> <span class="token punctuation">,</span> <span class="token symbol">:name</span> <span class="token punctuation">.</span> inspect name <span class="token symbol">:name</span> <span class="token operator">></span> <span class="token operator">></span> puts <span class="token string">"It worked!"</span> <span class="token punctuation">,</span> <span class="token string">"It worked!"</span> <span class="token punctuation">.</span> inspect <span class="token constant">It</span> worked <span class="token operator">!</span> <span class="token string">"It worked!"</span> |
We have a short script for inspect which is:
1 2 3 | <span class="token operator">></span> <span class="token operator">></span> p <span class="token symbol">:name</span> <span class="token comment"># Same output as 'puts :name.inspect'</span> <span class="token symbol">:name</span> |
Application: unique words
Now we will apply the knowledge of hashes above and give it a try. Our task is to extract words from a fairly long paragraph, and count the number of times that word appears.
Since our code looks long, we will create a Ruby file for easy manipulation. We can create the file by typing the following command:
$ touch count.rb
and initialize a variable containing string like so:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | sonnet <span class="token operator">=</span> " <span class="token constant">Let</span> me <span class="token keyword">not</span> to the marriage of <span class="token boolean">true</span> minds <span class="token constant">Admit</span> impediments <span class="token punctuation">.</span> <span class="token constant">Love</span> is <span class="token keyword">not</span> love <span class="token constant">Which</span> alters <span class="token keyword">when</span> it alteration finds <span class="token punctuation">,</span> <span class="token constant">Or</span> bends with the remover to remove <span class="token punctuation">.</span> <span class="token constant">O</span> no <span class="token punctuation">,</span> it is an ever <span class="token operator">-</span> fixed mark <span class="token constant">That</span> looks on tempests <span class="token keyword">and</span> is never shaken <span class="token constant">It</span> is the star to every wand'ring bark <span class="token punctuation">,</span> <span class="token constant">Whose</span> worth's unknown <span class="token punctuation">,</span> although his height be taken <span class="token punctuation">.</span> <span class="token constant">Love</span> <span class="token string">'s not time'</span> s fool <span class="token punctuation">,</span> though rosy lips <span class="token keyword">and</span> cheeks <span class="token constant">Within</span> his bending sickle's compass come <span class="token punctuation">:</span> <span class="token constant">Love</span> alters <span class="token keyword">not</span> with his brief hours <span class="token keyword">and</span> weeks <span class="token punctuation">,</span> <span class="token constant">But</span> bears it out even to the edge of doom <span class="token punctuation">.</span> <span class="token constant">If</span> this be error <span class="token keyword">and</span> upon me proved <span class="token punctuation">,</span> <span class="token constant">I</span> never writ <span class="token punctuation">,</span> nor no man ever loved <span class="token punctuation">.</span> " |
And the initialization of a hash is uniques containing unique words: uniques = {}
.
Then define the words variable that contains one or more words, using regular expression: words = sonnet.scan(/w+/)
And use the scan method to return an array of string matches with the regex above.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | sonnet <span class="token operator">=</span> " <span class="token constant">Let</span> me <span class="token keyword">not</span> to the marriage of <span class="token boolean">true</span> minds <span class="token constant">Admit</span> impediments <span class="token punctuation">.</span> <span class="token constant">Love</span> is <span class="token keyword">not</span> love <span class="token constant">Which</span> alters <span class="token keyword">when</span> it alteration finds <span class="token punctuation">,</span> <span class="token constant">Or</span> bends with the remover to remove <span class="token punctuation">.</span> <span class="token constant">O</span> no <span class="token punctuation">,</span> it is an ever <span class="token operator">-</span> fixed mark <span class="token constant">That</span> looks on tempests <span class="token keyword">and</span> is never shaken <span class="token constant">It</span> is the star to every wand'ring bark <span class="token punctuation">,</span> <span class="token constant">Whose</span> worth's unknown <span class="token punctuation">,</span> although his height be taken <span class="token punctuation">.</span> <span class="token constant">Love</span> <span class="token string">'s not time'</span> s fool <span class="token punctuation">,</span> though rosy lips <span class="token keyword">and</span> cheeks <span class="token constant">Within</span> his bending sickle's compass come <span class="token punctuation">:</span> <span class="token constant">Love</span> alters <span class="token keyword">not</span> with his brief hours <span class="token keyword">and</span> weeks <span class="token punctuation">,</span> <span class="token constant">But</span> bears it out even to the edge of doom <span class="token punctuation">.</span> <span class="token constant">If</span> this be error <span class="token keyword">and</span> upon me proved <span class="token punctuation">,</span> <span class="token constant">I</span> never writ <span class="token punctuation">,</span> nor no man ever loved <span class="token punctuation">.</span> " uniques <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> words <span class="token operator">=</span> sonnet <span class="token punctuation">.</span> scan <span class="token punctuation">(</span> <span class="token regex">/w+/</span> <span class="token punctuation">)</span> |
Next, we’ll loop through the words array and do the following:
- If the word already exists, add 1
- If the word does not exist, the initialization is 1 Use operator + = to perform, as follows:
1 2 3 4 5 6 7 8 | words.each do |word| if uniques[word] uniques[word] += 1 else uniques[word] = 1 end end |
And finally the output: puts uniques
The full code will look like this:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | sonnet <span class="token operator">=</span> " <span class="token constant">Let</span> me <span class="token keyword">not</span> to the marriage of <span class="token boolean">true</span> minds <span class="token constant">Admit</span> impediments <span class="token punctuation">.</span> <span class="token constant">Love</span> is <span class="token keyword">not</span> love <span class="token constant">Which</span> alters <span class="token keyword">when</span> it alteration finds <span class="token punctuation">,</span> <span class="token constant">Or</span> bends with the remover to remove <span class="token punctuation">.</span> <span class="token constant">O</span> no <span class="token punctuation">,</span> it is an ever <span class="token operator">-</span> fixed mark <span class="token constant">That</span> looks on tempests <span class="token keyword">and</span> is never shaken <span class="token constant">It</span> is the star to every wand'ring bark <span class="token punctuation">,</span> <span class="token constant">Whose</span> worth's unknown <span class="token punctuation">,</span> although his height be taken <span class="token punctuation">.</span> <span class="token constant">Love</span> <span class="token string">'s not time'</span> s fool <span class="token punctuation">,</span> though rosy lips <span class="token keyword">and</span> cheeks <span class="token constant">Within</span> his bending sickle's compass come <span class="token punctuation">:</span> <span class="token constant">Love</span> alters <span class="token keyword">not</span> with his brief hours <span class="token keyword">and</span> weeks <span class="token punctuation">,</span> <span class="token constant">But</span> bears it out even to the edge of doom <span class="token punctuation">.</span> <span class="token constant">If</span> this be error <span class="token keyword">and</span> upon me proved <span class="token punctuation">,</span> <span class="token constant">I</span> never writ <span class="token punctuation">,</span> nor no man ever loved <span class="token punctuation">.</span> " <span class="token comment"># Unique words</span> uniques <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token comment"># All words in the text</span> words <span class="token operator">=</span> sonnet <span class="token punctuation">.</span> scan <span class="token punctuation">(</span> <span class="token regex">/w+/</span> <span class="token punctuation">)</span> <span class="token comment"># Iterate through `words` and build up a hash of unique words.</span> words <span class="token punctuation">.</span> <span class="token keyword">each</span> <span class="token keyword">do</span> <span class="token operator">|</span> word <span class="token operator">|</span> <span class="token keyword">if</span> uniques <span class="token punctuation">[</span> word <span class="token punctuation">]</span> uniques <span class="token punctuation">[</span> word <span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token operator">=</span> <span class="token number">1</span> <span class="token keyword">else</span> uniques <span class="token punctuation">[</span> word <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span> <span class="token keyword">end</span> <span class="token keyword">end</span> puts uniques |
Run the file count.rb , we get the following results:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $ ruby count <span class="token punctuation">.</span> rb <span class="token punctuation">{</span> <span class="token string">"Let"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"me"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token string">"not"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">4</span> <span class="token punctuation">,</span> <span class="token string">"to"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">4</span> <span class="token punctuation">,</span> <span class="token string">"the"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">4</span> <span class="token punctuation">,</span> <span class="token string">"marriage"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"of"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token string">"true"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"minds"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"Admit"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"impediments"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"Love"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token string">"is"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">4</span> <span class="token punctuation">,</span> <span class="token string">"love"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"Which"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"alters"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token string">"when"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"it"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token string">"alteration"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"finds"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"Or"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"bends"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"with"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token string">"remover"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"remove"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"O"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"no"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token string">"an"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"ever"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token string">"fixed"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"mark"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"That"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"looks"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"on"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"tempests"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"and"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">4</span> <span class="token punctuation">,</span> <span class="token string">"never"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token string">"shaken"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"It"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"star"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"every"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"wand"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"ring"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"bark"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"Whose"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"worth"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"s"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">4</span> <span class="token punctuation">,</span> <span class="token string">"unknown"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"although"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"his"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token string">"height"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"be"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token string">"taken"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"time"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"fool"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"though"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"rosy"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"lips"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"cheeks"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"Within"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"bending"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"sickle"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"compass"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"come"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"brief"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"hours"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"weeks"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"But"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"bears"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"out"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"even"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"edge"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"doom"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"If"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"this"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"error"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"upon"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"proved"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"I"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"writ"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"nor"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"man"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"loved"</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token number">1</span> <span class="token punctuation">}</span> |
Over. We will learn together about other topics in Ruby in the next posts.
Source: Learn-enough