Learn Enough Ruby to be Dangerous LiveLessons: A Tutorial Introduction to Programming with Ruby
In Learn Enough Ruby to Be Dangerous: Write Programs, Publish Gems, and Develop Sinatra Web Apps with Ruby, renowned instructor Michael Hartl teaches the concepts, skills, and approaches you need to be professionally productive with Ruby for both general-purpose programming and beginning web app development.
Programmers love Ruby for its elegance, power, and flexibility: that’s why it was chosen for the Ruby on Rails framework that launched websites from Shopify to Coinbase. You’ll love Ruby too, but you don’t need to learn “everything” about it, just how to use it efficiently to solve real problems. Best-selling author and leading Rails developer Michael Hartl gets you started writing practical and modern Ruby programs as fast as possible, with a focus on the real tools used every day by software developers. You’ll learn how to use Ruby interactively, write shell scripts in Ruby, and use Ruby to make simple dynamic web applications.
Even if you’re new to programming, Hartl helps you quickly build technical sophistication as you gain a solid understanding of object-oriented and functional programming, develop and publish a self-contained Ruby package (a gem), and use your gem to build and deploy a dynamic web app with the Sinatra framework. Focused exercises help you internalize what matters, without wasting time on details pros don’t care about. Soon, it’ll be like you were born knowing this stuff—and you’ll be suddenly, seriously dangerous.
Michael Hartl is the creator of the Ruby on Rails Tutorial, one of the leading introductions to web development, and is cofounder and principal author at Learn Enough. Previously, he was a physics instructor at the California Institute of Technology (Caltech), where he received a Lifetime Achievement Award for Excellence in Teaching. He is a graduate of Harvard College, has a PhD in Physics from Caltech, and is an alumnus of the Y Combinator entrepreneur program.
Learn How To
- Create a simple “hello, world” program using several different techniques
- Deploy a simple dynamic Ruby application to the web
- Use strings, arrays, and other native objects
- Define functions
- Use Ruby for functional programming
- Utilize test-driven development
- Write a shell script
- Develop a full Ruby web application for detecting palindromes
Who Should Take This Course
New and experienced developers looking for a practical introduction to Ruby. The course can also serve as a prerequisite for the popular Ruby on Rails Tutorial or as a natural follow-up to it.
The only prerequisites are a familiarity with basic developer tools (command line, text editor, and Git) and beginning HTML
Some programming experience is useful but is not required
Lesson 1: Hello World!
Lesson 1 begins at the beginning by having you create four simple “hello, world” programs using several different techniques. The main purpose of the “hello, world” is to make sure your system is correctly configured to execute the simple program that prints the string “hello, world!” to the screen. You start by writing a series of programs to display a greeting at a command line terminal, first in a REPL called irb (interactive Ruby), then from a file, and then from a shell script. Finally, you write and deploy a simple proof-of-concept web application using the Sinatra web framework.
Lesson 2: Strings
Lesson 2 covers strings, probably the most important data structure on the web since web pages ultimately consist of strings and characters sent to and from the browser. Many other kinds of programs require string manipulation as well. Thus, strings are a great place to start your Ruby programming journey. The lesson starts with what strings are and how to create them, including both single- and double-quoted strings. You then learn how to join, or concatenate, one string to another. Next, you learn how to print to the screen from the terminal window. As part of this, you see your first examples of Ruby boolean variables and control flow. Finally, you learn how to iterate over strings with for loops, enabling you to access strings one character at a time.
Lesson 3: Arrays
In Lesson 2, you learned that strings can be thought of sequences of characters in a particular order. In Lesson 3, you learn about the array data type, which is the general Ruby container for arbitrary elements in a particular order. You start by explicitly connecting strings and arrays via the string split method, and then you learn about various array methods throughout the rest of the lesson. After learning to split strings, you learn how to access elements in the resulting array, discovering that the same syntax works on strings, further deepening the connection between the two data types. Next, you learn a variety of additional array methods beginning with selecting both single elements and multiple elements at once using array slicing, including the useful range datatype, and a clever technique using range indices to select the last element in an array. Then you learn how to sort arrays, which, if you have ever written a sorting algorithm by hand, you will find Ruby makes ridiculously easy. You also learn how to reverse arrays, a capability you will put to good use later on in the tutorial when learning to detect palindromes. Next, you learn how to add and remove array elements using push and pop, including an introduction to the important shovel operator. You then learn how to undo a string split with an array and join. Finally, you learn how to iterate through arrays using the same kind of for loop covered in Lesson 2, which is valuable preparation for more advanced techniques covered in Lessons 5 and 6.
Lesson 4: Other Native Objects
Now that we have taken a look at strings and arrays, Lesson 4 continues with a tour of some other important Ruby objects, which gives you a chance to learn about math, dates, regular expressions, and hashes. Like most programming languages, Ruby supports a large number of mathematical operations right out of the box, such as addition, subtraction, multiplication, and division. It also includes a math library with more advanced operations such as logarithms and trigonometric functions. You also learn how to deal with times and dates in Ruby, such as getting the year, the day, or the exact time. This gives you your first chance to use the new function, a so-called constructor function, which is the standard Ruby way to create a new object. This lesson includes an introduction to the powerful subject of regular expressions, which are discussed briefly in Learn Enough Developer Tools to be Dangerous in the context of text editors and the grep command. Often called regexes for short, regular expressions are a powerful mini-language for matching patterns in text. You learn how to use regexes to quickly search strings for things like five digits in a row, thereby matching standard United States ZIP codes. The lesson ends with an introduction to hashes in Ruby. You use such objects to create collections of key–value pairs, sometimes known as associative arrays, which are like regular arrays but with strings instead of integers as indices. You apply this important object type to write your first substantial Ruby program, a shell script to count the unique words in a text.
Lesson 5: Functions and Blocks
So far in this tutorial, Ruby functions have been mentioned repeatedly, and in Lesson 5 you finally learn to define functions of your own. The resulting ability gives us greater flexibility as programmers and enables powerful techniques like the each method, which is covered in this lesson, and functional programming, which is the subject of Lesson 6. You begin your study of functions in the read-eval-print loop, that is, the REPL, and then you learn how to put your function definitions in a file for use in a simple Sinatra web application. The lesson also covers how to use multiple functions in a row, a technique known as method chaining. Method chaining is used to make a first definition of a palindrome function to see whether a string is the same forward and backward. The lesson ends with a discussion of the each method of iterating through arrays, which often provides a more convenient way of processing array elements than the for loop introduced in Lesson 2. This gives you your first introduction to blocks, a feature Ruby shares with only a few other languages and which are the source of much of Ruby’s unusual flexibility and power.
Lesson 6: Functional Programming
Having learned how to define functions and apply them in a couple of different contexts. In Lesson 6, you take your programming to the next level by learning the basics of functional programming, a style of programming that emphasizes, you guessed it, functions. This is a challenging lesson, and you may have to watch it a couple of times to absorb everything, but the rewards are rich indeed. It focuses on the triumvirate of functions commonly used in functional programming, that is, map, select, and reduce. The first of our examples is the map function, which lets you map a function over an array of elements. It is often a powerful alternative to looping. The second function covered is select, which enables you to select your data based on some boolean criterion. For example, you can take an array of integers and select for only numbers evenly divisible by two, giving you a quick way to select only the even numbers in the array. The third function is the mighty reduce, which is exactly the kind of powerful technique that can take lots of examples to really sink in but enables you to write remarkably clean and concise code. Because reduce, and indeed all functional techniques, can be challenging to understand even for experienced developers, it is especially powerful when combined with test-driven development, which is covered in Lesson 8.
Lesson 7: Objects and Classes
In Lesson 7, you learn how to make your very own Ruby objects, which can have both attributes, which are data, and methods, which are functions, attached to them. The way to define objects in Ruby is using the class method, which gives rise to an object constructor function that can be used to create or instantiate a new object called an instance using the new method you first saw in Lesson 4. This gives you the background needed to understand Ruby’s object system, which pervades the language. Indeed, it is often said that everything in Ruby is an object. In this lesson you learn the precise technical meaning of this description. You start with a concrete example of a phrase object that knows whether or not the phrase is a palindrome. You then add a translated phrase object that overrides the main palindrome method and substitutes a translated phrase instead. These examples enable you to understand inheritance and derived classes, which are key ideals in object-oriented programming. The lesson even discusses the powerful, even dangerous, practice of modifying native Ruby objects. This enables us to modify the string class itself, giving every string the capability to tell whether or not it is a palindrome. Finally, we learn about Ruby modules, also called mixins. Ruby modules give us a way to factor out common functionality and then mix it into multiple classes, which is a great way to avoid duplication and reuse code.
Lesson 8: Testing and Test-Driven Development
Although rarely covered in introductory programming tutorials, automated testing is one of the most important subjects in modern software development. Accordingly, Lesson 8 gives you an introduction to testing in Ruby, including a first look at test-driven development, or TDD. Test-driven development came up briefly in Lesson 6, where we promised that you would use testing techniques to add an important capability to finding palindromes, namely being able to detect complicated palindromes such as, “A man a plan a canal—Panama!” or “Madam, I’m Adam”. This lesson fulfills that promise. You start by setting up our system for testing using the minitest framework. The strategy for testing the current palindrome code and extending it to more complicated phrases is as follows. One, set up your system for automating testing. Two, write automated tests for the existing palindrome functionality. Three, write a failing test for the enhanced palindrome detector known as red. This is the first step in the TDD cycle known as red, green, refactor. Four, write possibly ugly code to get the test passing, also known as green, which is the second step in red, green, refactor. Five, refactor the code, which involves changing its form without changing its function. Because the code should accomplish the same results the entire time, the test suite should remain green even after refactoring, thereby completing the red, green, refactor cycle. As it turns out, learning how to write Ruby tests also gives you a chance to learn how to create and use self-contained software packages called Ruby gems, another valuable skill for longer Ruby programming.
Lesson 9: Shell Scripts
Lesson 10: A Live Web Application
Table of Contents
1 Learn Enough Ruby to Be Dangerous Introduction
Lesson 01 Hello World!
3 Introduction to Ruby
4 Ruby in a REPL
5 Ruby in a file
6 Ruby in a shell script
7 Ruby in a web browser
Lesson 02 Strings
9 String basics
10 Concatenation and interpolation
12 Attributes, Booleans, and control flow
14 String iteration
Lesson 03 Arrays
17 Array access
18 Array slicing
19 More array methods
20 Array iteration
Lesson 04 Other Native Objects
24 Regular expressions
26 Application Unique words
Lesson 05 Functions and Blocks
28 Function definitions
29 Functions in a file
30 Method chaining
Lesson 06 Functional Programming
Lesson 07 Objects and Classes
37 Defining classes
39 Derived classes
40 Modifying native objects
Lesson 08 Testing and Test-Driven Development
43 Testing and Ruby gem setup
44 Initial test coverage
Lesson 09 Shell Scripts
49 Reading from files
50 Reading from URLs
51 DOM manipulation at the command line
Lesson 10 A Live Web Application
54 Site pages
56 Embedded Ruby
57 Palindrome detector
59 Learn Enough Ruby to Be Dangerous Summary