301 Ruby Basics [2 PT]

Updated . Posted . Visible to the public.

Based on the Ruby Basics Card in the developer Curriculum

Ruby is the programming language we use on the backend.

Goals

After finishing this lesson you should be able to read and write simple Ruby programs.

Gain an understanding of the following concepts:

  • Working with basic datatypes: String, Integer, Float, Boolean, Array, Hash
  • Control flow: if, each, case, break...
  • Functions: def, return, implicit return in methods and blocks
  • Errors, raise and rescue
  • Classes and inheritance
  • The difference between class methods and instance methods (def self.method vs. def method)
  • Modules and include
  • Input and output
  • Simple regular expressions

Resources

Tutorials

Here are some tutorial to get you started with learning Ruby. You don't need to read them all. Pick some that work for you.

References

When you're looking for detailed information on a Ruby class or method, you can Google it or use one of these references:

Exercises

Create a separate Merge Request in Gitlab for every exercise.

Counting words

Write a small ruby programm count_words.rb that accepts a filename, counts the number of words, lines and paragraphs, and outputs the result.

For example:

$ ruby count_words.rb test.txt

test.txt has 123 words
test.txt has 13 lines
test.txt has 4 paragraphs

Hint

Write a Contact class that models an address book entry.

It should offer an API like this:

contact = Contact.new(first_name: 'Anna', last_name: 'Muster', street: 'Foo Avenue 77')
contact.first_name # => 'Anna'
contact.last_name # => 'Muster'

A Contact object should be able to store:

  • First name
  • Last name
  • Street
  • Postal code
  • City
  • Phone numbers

All fields are optional, except for #last_name. If we try to instantiate a contact without a last name, the constructor raises an error:

Contact.new(first_name: 'Anna') # raises ArgumentError

Now build an AddressBook class that can store a list of contacts in memory:

addresses = AddressBook.new
addresses.add Contact.new(first_name: 'Frederik', last_name: 'Foo')
addresses.add Contact.new(first_name: 'Berta', last_name: 'Beispiel', phone: '556677')
addresses.add Contact.new(first_name: 'Anna', last_name: 'Muster', street: 'Foo Avenue 77')
addresses.size # => 3

Now write a method AddressBook#search that takes a query string and returns an array of Contact objects that match the given word in any of their properties (name, street, city, etc.):

results = addresses.search('foo') # returns an Array of "Frederik" and "Anna" contacts
results.size # => 2
results[0].class # => Contact
results[0].first_name # => "Frederik"
results[1].street # => "Foo Avenue 77"

Hint

You can convert any object to a string by calling #to_s on it.

The matching should be case-insensitive Show archive.org snapshot .

Also when the query string contains more than one word, it returns contacts that match all of the words in any property:

results = addresses.search('77 berta')
results.size # => 1
results[0].first_name # => "Berta"

Errors

Change the AddressBook class so the #add method throws a DuplicateContact error when the user tries to add a contact that already exist. We consider two contacts to be duplicates if they have the same first and last name.

Hint

Create a custom error class Show archive.org snapshot that inherits from StandardError.

A fun read is Ninja code Show archive.org snapshot (even though it's Javascript).

Claus-Theodor Riegg
Last edit
Simon Hofmann
License
Source code in this card is licensed under the MIT License.
Posted by Claus-Theodor Riegg to DevOps Curriculum (2022-06-21 07:21)